formatting changes; attempt at keyboard-based window switching
This commit is contained in:
parent
7ce3f20d73
commit
ac33a34a29
11 changed files with 494 additions and 411 deletions
|
|
@ -15,18 +15,19 @@ Client *current;
|
||||||
void
|
void
|
||||||
setactive(Client *c, int on)
|
setactive(Client *c, int on)
|
||||||
{
|
{
|
||||||
if (c->parent == c->screen->root) {
|
// dbg("setactive client %x %d", c->window, c->on);
|
||||||
fprintf(stderr, "rio: bad parent in setactive; dumping core\n");
|
|
||||||
abort();
|
if(c->parent == c->screen->root)
|
||||||
}
|
return;
|
||||||
if (on) {
|
|
||||||
|
if(on){
|
||||||
XUngrabButton(dpy, AnyButton, AnyModifier, c->parent);
|
XUngrabButton(dpy, AnyButton, AnyModifier, c->parent);
|
||||||
XSetInputFocus(dpy, c->window, RevertToPointerRoot, timestamp());
|
XSetInputFocus(dpy, c->window, RevertToPointerRoot, timestamp());
|
||||||
if (c->proto & Ptakefocus)
|
if(c->proto & Ptakefocus)
|
||||||
sendcmessage(c->window, wm_protocols, wm_take_focus, 0, 1);
|
sendcmessage(c->window, wm_protocols, wm_take_focus, 0, 1);
|
||||||
cmapfocus(c);
|
cmapfocus(c);
|
||||||
} else {
|
}else{
|
||||||
if (c->proto & Plosefocus)
|
if(c->proto & Plosefocus)
|
||||||
sendcmessage(c->window, wm_protocols, wm_lose_focus, 0, 1);
|
sendcmessage(c->window, wm_protocols, wm_lose_focus, 0, 1);
|
||||||
XGrabButton(dpy, AnyButton, AnyModifier, c->parent, False,
|
XGrabButton(dpy, AnyButton, AnyModifier, c->parent, False,
|
||||||
ButtonMask, GrabModeAsync, GrabModeSync, None, None);
|
ButtonMask, GrabModeAsync, GrabModeSync, None, None);
|
||||||
|
|
@ -51,7 +52,7 @@ draw_border(Client *c, int active)
|
||||||
pixel = c->screen->inactiveborder;
|
pixel = c->screen->inactiveborder;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug) fprintf(stderr, "draw_border %p pixel %ld active %d hold %d\n", c, pixel, active, c->hold);
|
if(debug) fprintf(stderr, "draw_border %p pixel %ld active %d hold %d\n", c, pixel, active, c->hold);
|
||||||
XSetWindowBackground(dpy, c->parent, pixel);
|
XSetWindowBackground(dpy, c->parent, pixel);
|
||||||
XClearWindow(dpy, c->parent);
|
XClearWindow(dpy, c->parent);
|
||||||
}
|
}
|
||||||
|
|
@ -61,27 +62,27 @@ active(Client *c)
|
||||||
{
|
{
|
||||||
Client *cc;
|
Client *cc;
|
||||||
|
|
||||||
if (c == 0) {
|
if(c == 0){
|
||||||
fprintf(stderr, "rio: active(c==0)\n");
|
fprintf(stderr, "rio: active(c==0)\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (c == current)
|
if(c == current)
|
||||||
return;
|
return;
|
||||||
if (current) {
|
if(current){
|
||||||
setactive(current, 0);
|
setactive(current, 0);
|
||||||
if (current->screen != c->screen)
|
if(current->screen != c->screen)
|
||||||
cmapnofocus(current->screen);
|
cmapnofocus(current->screen);
|
||||||
}
|
}
|
||||||
setactive(c, 1);
|
setactive(c, 1);
|
||||||
for (cc = clients; cc; cc = cc->next)
|
for(cc = clients; cc; cc = cc->next)
|
||||||
if (cc->revert == c)
|
if(cc->revert == c)
|
||||||
cc->revert = c->revert;
|
cc->revert = c->revert;
|
||||||
c->revert = current;
|
c->revert = current;
|
||||||
while (c->revert && !normal(c->revert))
|
while(c->revert && !normal(c->revert))
|
||||||
c->revert = c->revert->revert;
|
c->revert = c->revert->revert;
|
||||||
current = c;
|
current = c;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (debug)
|
if(debug)
|
||||||
dump_revert();
|
dump_revert();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
@ -94,10 +95,10 @@ nofocus(void)
|
||||||
XSetWindowAttributes attr;
|
XSetWindowAttributes attr;
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
if (current) {
|
if(current){
|
||||||
setactive(current, 0);
|
setactive(current, 0);
|
||||||
for (c = current->revert; c; c = c->revert)
|
for(c = current->revert; c; c = c->revert)
|
||||||
if (normal(c)) {
|
if(normal(c)){
|
||||||
active(c);
|
active(c);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -105,7 +106,7 @@ nofocus(void)
|
||||||
/* if no candidates to revert to, fall through */
|
/* if no candidates to revert to, fall through */
|
||||||
}
|
}
|
||||||
current = 0;
|
current = 0;
|
||||||
if (w == 0) {
|
if(w == 0){
|
||||||
mask = CWOverrideRedirect/*|CWColormap*/;
|
mask = CWOverrideRedirect/*|CWColormap*/;
|
||||||
attr.override_redirect = 1;
|
attr.override_redirect = 1;
|
||||||
/* attr.colormap = screens[0].def_cmap;*/
|
/* attr.colormap = screens[0].def_cmap;*/
|
||||||
|
|
@ -122,8 +123,8 @@ top(Client *c)
|
||||||
Client **l, *cc;
|
Client **l, *cc;
|
||||||
|
|
||||||
l = &clients;
|
l = &clients;
|
||||||
for (cc = *l; cc; cc = *l) {
|
for(cc = *l; cc; cc = *l){
|
||||||
if (cc == c) {
|
if(cc == c){
|
||||||
*l = c->next;
|
*l = c->next;
|
||||||
c->next = clients;
|
c->next = clients;
|
||||||
clients = c;
|
clients = c;
|
||||||
|
|
@ -139,14 +140,14 @@ getclient(Window w, int create)
|
||||||
{
|
{
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
if (w == 0 || getscreen(w))
|
if(w == 0 || getscreen(w))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (c = clients; c; c = c->next)
|
for(c = clients; c; c = c->next)
|
||||||
if (c->window == w || c->parent == w)
|
if(c->window == w || c->parent == w)
|
||||||
return c;
|
return c;
|
||||||
|
|
||||||
if (!create)
|
if(!create)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
c = (Client *)malloc(sizeof(Client));
|
c = (Client *)malloc(sizeof(Client));
|
||||||
|
|
@ -176,44 +177,44 @@ rmclient(Client *c)
|
||||||
{
|
{
|
||||||
Client *cc;
|
Client *cc;
|
||||||
|
|
||||||
for (cc = current; cc && cc->revert; cc = cc->revert)
|
for(cc = current; cc && cc->revert; cc = cc->revert)
|
||||||
if (cc->revert == c)
|
if(cc->revert == c)
|
||||||
cc->revert = cc->revert->revert;
|
cc->revert = cc->revert->revert;
|
||||||
|
|
||||||
if (c == clients)
|
if(c == clients)
|
||||||
clients = c->next;
|
clients = c->next;
|
||||||
for (cc = clients; cc && cc->next; cc = cc->next)
|
for(cc = clients; cc && cc->next; cc = cc->next)
|
||||||
if (cc->next == c)
|
if(cc->next == c)
|
||||||
cc->next = cc->next->next;
|
cc->next = cc->next->next;
|
||||||
|
|
||||||
if (hidden(c))
|
if(hidden(c))
|
||||||
unhidec(c, 0);
|
unhidec(c, 0);
|
||||||
|
|
||||||
if (c->parent != c->screen->root)
|
if(c->parent != c->screen->root)
|
||||||
XDestroyWindow(dpy, c->parent);
|
XDestroyWindow(dpy, c->parent);
|
||||||
|
|
||||||
c->parent = c->window = None; /* paranoia */
|
c->parent = c->window = None; /* paranoia */
|
||||||
if (current == c) {
|
if(current == c){
|
||||||
current = c->revert;
|
current = c->revert;
|
||||||
if (current == 0)
|
if(current == 0)
|
||||||
nofocus();
|
nofocus();
|
||||||
else {
|
else {
|
||||||
if (current->screen != c->screen)
|
if(current->screen != c->screen)
|
||||||
cmapnofocus(c->screen);
|
cmapnofocus(c->screen);
|
||||||
setactive(current, 1);
|
setactive(current, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (c->ncmapwins != 0) {
|
if(c->ncmapwins != 0){
|
||||||
XFree((char *)c->cmapwins);
|
XFree((char *)c->cmapwins);
|
||||||
free((char *)c->wmcmaps);
|
free((char *)c->wmcmaps);
|
||||||
}
|
}
|
||||||
if (c->iconname != 0)
|
if(c->iconname != 0)
|
||||||
XFree((char*) c->iconname);
|
XFree((char*) c->iconname);
|
||||||
if (c->name != 0)
|
if(c->name != 0)
|
||||||
XFree((char*) c->name);
|
XFree((char*) c->name);
|
||||||
if (c->instance != 0)
|
if(c->instance != 0)
|
||||||
XFree((char*) c->instance);
|
XFree((char*) c->instance);
|
||||||
if (c->class != 0)
|
if(c->class != 0)
|
||||||
XFree((char*) c->class);
|
XFree((char*) c->class);
|
||||||
memset(c, 0, sizeof(Client)); /* paranoia */
|
memset(c, 0, sizeof(Client)); /* paranoia */
|
||||||
free(c);
|
free(c);
|
||||||
|
|
@ -227,14 +228,14 @@ dump_revert(void)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
for (c = current; c; c = c->revert) {
|
for(c = current; c; c = c->revert){
|
||||||
fprintf(stderr, "%s(%x:%d)", c->label ? c->label : "?", c->window, c->state);
|
fprintf(stderr, "%s(%x:%d)", c->label ? c->label : "?", c->window, c->state);
|
||||||
if (i++ > 100)
|
if(i++ > 100)
|
||||||
break;
|
break;
|
||||||
if (c->revert)
|
if(c->revert)
|
||||||
fprintf(stderr, " -> ");
|
fprintf(stderr, " -> ");
|
||||||
}
|
}
|
||||||
if (current == 0)
|
if(current == 0)
|
||||||
fprintf(stderr, "empty");
|
fprintf(stderr, "empty");
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
}
|
}
|
||||||
|
|
@ -244,7 +245,41 @@ dump_clients(void)
|
||||||
{
|
{
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
for (c = clients; c; c = c->next)
|
for(c = clients; c; c = c->next)
|
||||||
fprintf(stderr, "w 0x%x parent 0x%x @ (%d, %d)\n", c->window, c->parent, c->x, c->y);
|
fprintf(stderr, "w 0x%x parent 0x%x @ (%d, %d)\n", c->window, c->parent, c->x, c->y);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
shuffle(int up)
|
||||||
|
{
|
||||||
|
Client **l, *c;
|
||||||
|
|
||||||
|
if(clients == 0 || clients->next == 0)
|
||||||
|
return;
|
||||||
|
if(up){
|
||||||
|
//for(c=clients; c->next; c=c->next)
|
||||||
|
// ;
|
||||||
|
for(l=&clients; (*l)->next; l=&(*l)->next)
|
||||||
|
;
|
||||||
|
c = *l;
|
||||||
|
*l = nil;
|
||||||
|
c->next = clients;
|
||||||
|
clients = c;
|
||||||
|
XMapRaised(dpy, c->parent);
|
||||||
|
top(c);
|
||||||
|
active(c);
|
||||||
|
}else{
|
||||||
|
c = clients;
|
||||||
|
for(l=&clients; *l; l=&(*l)->next)
|
||||||
|
;
|
||||||
|
clients = c->next;
|
||||||
|
*l = c;
|
||||||
|
c->next = 0;
|
||||||
|
XLowerWindow(dpy, c->window);
|
||||||
|
}
|
||||||
|
// XMapRaised(dpy, clients->parent);
|
||||||
|
// top(clients);
|
||||||
|
// active(clients);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ colorpixel(Display *dpy, ScreenInfo *s, int depth, unsigned long rgb, unsigned l
|
||||||
case 24:
|
case 24:
|
||||||
case 32:
|
case 32:
|
||||||
/* try to find byte order */
|
/* try to find byte order */
|
||||||
if (s->vis->red_mask & 0xff)
|
if(s->vis->red_mask & 0xff)
|
||||||
return (r) | (g<<8) | (b<<16); /* OK on Sun */
|
return (r) | (g<<8) | (b<<16); /* OK on Sun */
|
||||||
return rgb;
|
return rgb;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,7 @@ ScreenInfo *s;
|
||||||
XAllocNamedColor(dpy, DefaultColormap(dpy, s->num),
|
XAllocNamedColor(dpy, DefaultColormap(dpy, s->num),
|
||||||
"white", &wh, &dummy);
|
"white", &wh, &dummy);
|
||||||
|
|
||||||
if (nostalgia) {
|
if(nostalgia){
|
||||||
s->arrow = getcursor(&blitarrow, s);
|
s->arrow = getcursor(&blitarrow, s);
|
||||||
s->target = getcursor(&blittarget, s);
|
s->target = getcursor(&blittarget, s);
|
||||||
s->sweep0 = getcursor(&blitsweep, s);
|
s->sweep0 = getcursor(&blitsweep, s);
|
||||||
|
|
|
||||||
|
|
@ -24,23 +24,23 @@ handler(Display *d, XErrorEvent *e)
|
||||||
{
|
{
|
||||||
char msg[80], req[80], number[80];
|
char msg[80], req[80], number[80];
|
||||||
|
|
||||||
if (initting && (e->request_code == X_ChangeWindowAttributes) && (e->error_code == BadAccess)) {
|
if(initting && (e->request_code == X_ChangeWindowAttributes) && (e->error_code == BadAccess)){
|
||||||
fprintf(stderr, "rio: it looks like there's already a window manager running; rio not started\n");
|
fprintf(stderr, "rio: it looks like there's already a window manager running; rio not started\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ignore_badwindow && (e->error_code == BadWindow || e->error_code == BadColor))
|
if(ignore_badwindow && (e->error_code == BadWindow || e->error_code == BadColor))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
XGetErrorText(d, e->error_code, msg, sizeof(msg));
|
XGetErrorText(d, e->error_code, msg, sizeof(msg));
|
||||||
sprintf(number, "%d", e->request_code);
|
sprintf(number, "%d", e->request_code);
|
||||||
XGetErrorDatabaseText(d, "XRequest", number, "", req, sizeof(req));
|
XGetErrorDatabaseText(d, "XRequest", number, "", req, sizeof(req));
|
||||||
if (req[0] == '\0')
|
if(req[0] == '\0')
|
||||||
sprintf(req, "<request-code-%d>", (int)e->request_code);
|
sprintf(req, "<request-code-%d>", (int)e->request_code);
|
||||||
|
|
||||||
fprintf(stderr, "rio: %s(0x%x): %s\n", req, (int)e->resourceid, msg);
|
fprintf(stderr, "rio: %s(0x%x): %s\n", req, (int)e->resourceid, msg);
|
||||||
|
|
||||||
if (initting) {
|
if(initting){
|
||||||
fprintf(stderr, "rio: failure during initialisation; aborting\n");
|
fprintf(stderr, "rio: failure during initialisation; aborting\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
@ -53,7 +53,7 @@ graberror(char *f, int err)
|
||||||
#ifdef DEBUG /* sick of "bug" reports; grab errors "just happen" */
|
#ifdef DEBUG /* sick of "bug" reports; grab errors "just happen" */
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
switch (err) {
|
switch (err){
|
||||||
case GrabNotViewable:
|
case GrabNotViewable:
|
||||||
s = "not viewable";
|
s = "not viewable";
|
||||||
break;
|
break;
|
||||||
|
|
@ -86,10 +86,10 @@ void
|
||||||
dotrace(char *s, Client *c, XEvent *e)
|
dotrace(char *s, Client *c, XEvent *e)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "rio: %s: c=0x%x", s, c);
|
fprintf(stderr, "rio: %s: c=0x%x", s, c);
|
||||||
if (c)
|
if(c)
|
||||||
fprintf(stderr, " x %d y %d dx %d dy %d w 0x%x parent 0x%x", c->x, c->y, c->dx, c->dy, c->window, c->parent);
|
fprintf(stderr, " x %d y %d dx %d dy %d w 0x%x parent 0x%x", c->x, c->y, c->dx, c->dy, c->window, c->parent);
|
||||||
#ifdef DEBUG_EV
|
#ifdef DEBUG_EV
|
||||||
if (e) {
|
if(e){
|
||||||
fprintf(stderr, "\n\t");
|
fprintf(stderr, "\n\t");
|
||||||
ShowEvent(e);
|
ShowEvent(e);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,25 +15,33 @@ void
|
||||||
mainloop(int shape_event)
|
mainloop(int shape_event)
|
||||||
{
|
{
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
|
XKeyEvent *ke;
|
||||||
|
|
||||||
for (;;) {
|
Top:
|
||||||
|
for(;;){
|
||||||
getevent(&ev);
|
getevent(&ev);
|
||||||
|
|
||||||
#ifdef DEBUG_EV
|
#ifdef DEBUG_EV
|
||||||
if (debug) {
|
if(debug){
|
||||||
ShowEvent(&ev);
|
ShowEvent(&ev);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
switch (ev.type) {
|
switch (ev.type){
|
||||||
default:
|
default:
|
||||||
#ifdef SHAPE
|
#ifdef SHAPE
|
||||||
if (shape && ev.type == shape_event)
|
if(shape && ev.type == shape_event)
|
||||||
shapenotify((XShapeEvent *)&ev);
|
shapenotify((XShapeEvent *)&ev);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
fprintf(stderr, "rio: unknown ev.type %d\n", ev.type);
|
fprintf(stderr, "rio: unknown ev.type %d\n", ev.type);
|
||||||
break;
|
break;
|
||||||
|
case KeyPress:
|
||||||
|
keypress(&ev.xkey);
|
||||||
|
break;
|
||||||
|
case KeyRelease:
|
||||||
|
keyrelease(&ev.xkey);
|
||||||
|
break;
|
||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
button(&ev.xbutton);
|
button(&ev.xbutton);
|
||||||
break;
|
break;
|
||||||
|
|
@ -117,26 +125,26 @@ configurereq(XConfigureRequestEvent *e)
|
||||||
|
|
||||||
e->value_mask &= ~CWSibling;
|
e->value_mask &= ~CWSibling;
|
||||||
|
|
||||||
if (c) {
|
if(c){
|
||||||
gravitate(c, 1);
|
gravitate(c, 1);
|
||||||
if (e->value_mask & CWX)
|
if(e->value_mask & CWX)
|
||||||
c->x = e->x;
|
c->x = e->x;
|
||||||
if (e->value_mask & CWY)
|
if(e->value_mask & CWY)
|
||||||
c->y = e->y;
|
c->y = e->y;
|
||||||
if (e->value_mask & CWWidth)
|
if(e->value_mask & CWWidth)
|
||||||
c->dx = e->width;
|
c->dx = e->width;
|
||||||
if (e->value_mask & CWHeight)
|
if(e->value_mask & CWHeight)
|
||||||
c->dy = e->height;
|
c->dy = e->height;
|
||||||
if (e->value_mask & CWBorderWidth)
|
if(e->value_mask & CWBorderWidth)
|
||||||
c->border = e->border_width;
|
c->border = e->border_width;
|
||||||
gravitate(c, 0);
|
gravitate(c, 0);
|
||||||
if (e->value_mask & CWStackMode) {
|
if(e->value_mask & CWStackMode){
|
||||||
if (e->detail == Above)
|
if(e->detail == Above)
|
||||||
top(c);
|
top(c);
|
||||||
else
|
else
|
||||||
e->value_mask &= ~CWStackMode;
|
e->value_mask &= ~CWStackMode;
|
||||||
}
|
}
|
||||||
if (c->parent != c->screen->root && c->window == e->window) {
|
if(c->parent != c->screen->root && c->window == e->window){
|
||||||
wc.x = c->x-BORDER;
|
wc.x = c->x-BORDER;
|
||||||
wc.y = c->y-BORDER;
|
wc.y = c->y-BORDER;
|
||||||
wc.width = c->dx+2*BORDER;
|
wc.width = c->dx+2*BORDER;
|
||||||
|
|
@ -146,14 +154,14 @@ configurereq(XConfigureRequestEvent *e)
|
||||||
wc.stack_mode = e->detail;
|
wc.stack_mode = e->detail;
|
||||||
XConfigureWindow(dpy, c->parent, e->value_mask, &wc);
|
XConfigureWindow(dpy, c->parent, e->value_mask, &wc);
|
||||||
sendconfig(c);
|
sendconfig(c);
|
||||||
if (e->value_mask & CWStackMode) {
|
if(e->value_mask & CWStackMode){
|
||||||
top(c);
|
top(c);
|
||||||
active(c);
|
active(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c && c->init) {
|
if(c && c->init){
|
||||||
wc.x = BORDER;
|
wc.x = BORDER;
|
||||||
wc.y = BORDER;
|
wc.y = BORDER;
|
||||||
}
|
}
|
||||||
|
|
@ -182,23 +190,23 @@ mapreq(XMapRequestEvent *e)
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
trace("mapreq", c, e);
|
trace("mapreq", c, e);
|
||||||
|
|
||||||
if (c == 0 || c->window != e->window) {
|
if(c == 0 || c->window != e->window){
|
||||||
/* workaround for stupid NCDware */
|
/* workaround for stupid NCDware */
|
||||||
fprintf(stderr, "rio: bad mapreq c %p w %x, rescanning\n",
|
fprintf(stderr, "rio: bad mapreq c %p w %x, rescanning\n",
|
||||||
c, (int)e->window);
|
c, (int)e->window);
|
||||||
for (i = 0; i < num_screens; i++)
|
for(i = 0; i < num_screens; i++)
|
||||||
scanwins(&screens[i]);
|
scanwins(&screens[i]);
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if (c == 0 || c->window != e->window) {
|
if(c == 0 || c->window != e->window){
|
||||||
fprintf(stderr, "rio: window not found after rescan\n");
|
fprintf(stderr, "rio: window not found after rescan\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (c->state) {
|
switch (c->state){
|
||||||
case WithdrawnState:
|
case WithdrawnState:
|
||||||
if (c->parent == c->screen->root) {
|
if(c->parent == c->screen->root){
|
||||||
if (!manage(c, 0))
|
if(!manage(c, 0))
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -210,7 +218,7 @@ mapreq(XMapRequestEvent *e)
|
||||||
XMapRaised(dpy, c->parent);
|
XMapRaised(dpy, c->parent);
|
||||||
top(c);
|
top(c);
|
||||||
setstate(c, NormalState);
|
setstate(c, NormalState);
|
||||||
if (c->trans != None && current && c->trans == current->window)
|
if(c->trans != None && current && c->trans == current->window)
|
||||||
active(c);
|
active(c);
|
||||||
break;
|
break;
|
||||||
case IconicState:
|
case IconicState:
|
||||||
|
|
@ -226,18 +234,18 @@ unmap(XUnmapEvent *e)
|
||||||
|
|
||||||
curtime = CurrentTime;
|
curtime = CurrentTime;
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if (c) {
|
if(c){
|
||||||
switch (c->state) {
|
switch (c->state){
|
||||||
case IconicState:
|
case IconicState:
|
||||||
if (e->send_event) {
|
if(e->send_event){
|
||||||
unhidec(c, 0);
|
unhidec(c, 0);
|
||||||
withdraw(c);
|
withdraw(c);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NormalState:
|
case NormalState:
|
||||||
if (c == current)
|
if(c == current)
|
||||||
nofocus();
|
nofocus();
|
||||||
if (!c->reparenting)
|
if(!c->reparenting)
|
||||||
withdraw(c);
|
withdraw(c);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -258,17 +266,17 @@ newwindow(XCreateWindowEvent *e)
|
||||||
ScreenInfo *s;
|
ScreenInfo *s;
|
||||||
|
|
||||||
/* we don't set curtime as nothing here uses it */
|
/* we don't set curtime as nothing here uses it */
|
||||||
if (e->override_redirect)
|
if(e->override_redirect)
|
||||||
return;
|
return;
|
||||||
c = getclient(e->window, 1);
|
c = getclient(e->window, 1);
|
||||||
if (c && c->window == e->window && (s = getscreen(e->parent))) {
|
if(c && c->window == e->window && (s = getscreen(e->parent))){
|
||||||
c->x = e->x;
|
c->x = e->x;
|
||||||
c->y = e->y;
|
c->y = e->y;
|
||||||
c->dx = e->width;
|
c->dx = e->width;
|
||||||
c->dy = e->height;
|
c->dy = e->height;
|
||||||
c->border = e->border_width;
|
c->border = e->border_width;
|
||||||
c->screen = s;
|
c->screen = s;
|
||||||
if (c->parent == None)
|
if(c->parent == None)
|
||||||
c->parent = c->screen->root;
|
c->parent = c->screen->root;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -280,7 +288,7 @@ destroy(Window w)
|
||||||
|
|
||||||
curtime = CurrentTime;
|
curtime = CurrentTime;
|
||||||
c = getclient(w, 0);
|
c = getclient(w, 0);
|
||||||
if (c == 0)
|
if(c == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rmclient(c);
|
rmclient(c);
|
||||||
|
|
@ -297,21 +305,21 @@ clientmesg(XClientMessageEvent *e)
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
curtime = CurrentTime;
|
curtime = CurrentTime;
|
||||||
if (e->message_type == exit_rio) {
|
if(e->message_type == exit_rio){
|
||||||
cleanup();
|
cleanup();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
if (e->message_type == restart_rio) {
|
if(e->message_type == restart_rio){
|
||||||
fprintf(stderr, "*** rio restarting ***\n");
|
fprintf(stderr, "*** rio restarting ***\n");
|
||||||
cleanup();
|
cleanup();
|
||||||
execvp(myargv[0], myargv);
|
execvp(myargv[0], myargv);
|
||||||
perror("rio: exec failed");
|
perror("rio: exec failed");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (e->message_type == wm_change_state) {
|
if(e->message_type == wm_change_state){
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if (e->format == 32 && e->data.l[0] == IconicState && c != 0) {
|
if(e->format == 32 && e->data.l[0] == IconicState && c != 0){
|
||||||
if (normal(c))
|
if(normal(c))
|
||||||
hide(c);
|
hide(c);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -330,19 +338,19 @@ cmap(XColormapEvent *e)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* we don't set curtime as nothing here uses it */
|
/* we don't set curtime as nothing here uses it */
|
||||||
if (e->new) {
|
if(e->new){
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if (c) {
|
if(c){
|
||||||
c->cmap = e->colormap;
|
c->cmap = e->colormap;
|
||||||
if (c == current)
|
if(c == current)
|
||||||
cmapfocus(c);
|
cmapfocus(c);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
for (c = clients; c; c = c->next) {
|
for(c = clients; c; c = c->next){
|
||||||
for (i = 0; i < c->ncmapwins; i++)
|
for(i = 0; i < c->ncmapwins; i++)
|
||||||
if (c->cmapwins[i] == e->window) {
|
if(c->cmapwins[i] == e->window){
|
||||||
c->wmcmaps[i] = e->colormap;
|
c->wmcmaps[i] = e->colormap;
|
||||||
if (c == current)
|
if(c == current)
|
||||||
cmapfocus(c);
|
cmapfocus(c);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -362,19 +370,19 @@ property(XPropertyEvent *e)
|
||||||
a = e->atom;
|
a = e->atom;
|
||||||
delete = (e->state == PropertyDelete);
|
delete = (e->state == PropertyDelete);
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if (c == 0)
|
if(c == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (a) {
|
switch (a){
|
||||||
case XA_WM_ICON_NAME:
|
case XA_WM_ICON_NAME:
|
||||||
if (c->iconname != 0)
|
if(c->iconname != 0)
|
||||||
XFree((char*) c->iconname);
|
XFree((char*) c->iconname);
|
||||||
c->iconname = delete ? 0 : getprop(c->window, a);
|
c->iconname = delete ? 0 : getprop(c->window, a);
|
||||||
setlabel(c);
|
setlabel(c);
|
||||||
renamec(c, c->label);
|
renamec(c, c->label);
|
||||||
return;
|
return;
|
||||||
case XA_WM_NAME:
|
case XA_WM_NAME:
|
||||||
if (c->name != 0)
|
if(c->name != 0)
|
||||||
XFree((char*) c->name);
|
XFree((char*) c->name);
|
||||||
c->name = delete ? 0 : getprop(c->window, a);
|
c->name = delete ? 0 : getprop(c->window, a);
|
||||||
setlabel(c);
|
setlabel(c);
|
||||||
|
|
@ -389,18 +397,18 @@ property(XPropertyEvent *e)
|
||||||
/* placeholders to not forget. ignore for now. -Axel */
|
/* placeholders to not forget. ignore for now. -Axel */
|
||||||
return;
|
return;
|
||||||
case XA_WM_NORMAL_HINTS:
|
case XA_WM_NORMAL_HINTS:
|
||||||
if (XGetWMNormalHints(dpy, c->window, &c->size, &msize) == 0 || c->size.flags == 0)
|
if(XGetWMNormalHints(dpy, c->window, &c->size, &msize) == 0 || c->size.flags == 0)
|
||||||
c->size.flags = PSize; /* not specified - punt */
|
c->size.flags = PSize; /* not specified - punt */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (a == _rio_hold_mode) {
|
if(a == _rio_hold_mode){
|
||||||
c->hold = getiprop(c->window, _rio_hold_mode);
|
c->hold = getiprop(c->window, _rio_hold_mode);
|
||||||
if (c == current)
|
if(c == current)
|
||||||
draw_border(c, 1);
|
draw_border(c, 1);
|
||||||
}
|
}
|
||||||
else if (a == wm_colormaps) {
|
else if(a == wm_colormaps){
|
||||||
getcmaps(c);
|
getcmaps(c);
|
||||||
if (c == current)
|
if(c == current)
|
||||||
cmapfocus(c);
|
cmapfocus(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -413,11 +421,11 @@ reparent(XReparentEvent *e)
|
||||||
ScreenInfo *s;
|
ScreenInfo *s;
|
||||||
|
|
||||||
/* we don't set curtime as nothing here uses it */
|
/* we don't set curtime as nothing here uses it */
|
||||||
if (!getscreen(e->event) || e->override_redirect)
|
if(!getscreen(e->event) || e->override_redirect)
|
||||||
return;
|
return;
|
||||||
if ((s = getscreen(e->parent)) != 0) {
|
if((s = getscreen(e->parent)) != 0){
|
||||||
c = getclient(e->window, 1);
|
c = getclient(e->window, 1);
|
||||||
if (c != 0 && (c->dx == 0 || c->dy == 0)) {
|
if(c != 0 && (c->dx == 0 || c->dy == 0)){
|
||||||
/* flush any errors */
|
/* flush any errors */
|
||||||
ignore_badwindow = 1;
|
ignore_badwindow = 1;
|
||||||
XGetWindowAttributes(dpy, c->window, &attr);
|
XGetWindowAttributes(dpy, c->window, &attr);
|
||||||
|
|
@ -430,13 +438,13 @@ reparent(XReparentEvent *e)
|
||||||
c->dy = attr.height;
|
c->dy = attr.height;
|
||||||
c->border = attr.border_width;
|
c->border = attr.border_width;
|
||||||
c->screen = s;
|
c->screen = s;
|
||||||
if (c->parent == None)
|
if(c->parent == None)
|
||||||
c->parent = c->screen->root;
|
c->parent = c->screen->root;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if (c != 0 && (c->parent == c->screen->root || withdrawn(c)))
|
if(c != 0 && (c->parent == c->screen->root || withdrawn(c)))
|
||||||
rmclient(c);
|
rmclient(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -449,7 +457,7 @@ shapenotify(XShapeEvent *e)
|
||||||
|
|
||||||
/* we don't set curtime as nothing here uses it */
|
/* we don't set curtime as nothing here uses it */
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if (c == 0)
|
if(c == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
setshape(c);
|
setshape(c);
|
||||||
|
|
@ -462,10 +470,10 @@ enter(XCrossingEvent *e)
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
curtime = e->time;
|
curtime = e->time;
|
||||||
if (e->mode != NotifyGrab || e->detail != NotifyNonlinearVirtual)
|
if(e->mode != NotifyGrab || e->detail != NotifyNonlinearVirtual)
|
||||||
return;
|
return;
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if (c != 0 && c != current) {
|
if(c != 0 && c != current){
|
||||||
/* someone grabbed the pointer; make them current */
|
/* someone grabbed the pointer; make them current */
|
||||||
XMapRaised(dpy, c->parent);
|
XMapRaised(dpy, c->parent);
|
||||||
top(c);
|
top(c);
|
||||||
|
|
@ -479,7 +487,7 @@ leave(XCrossingEvent *e)
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if (c)
|
if(c)
|
||||||
XUndefineCursor(dpy, c->parent);
|
XUndefineCursor(dpy, c->parent);
|
||||||
/* XDefineCursor(dpy, c->parent, c->screen->arrow); */
|
/* XDefineCursor(dpy, c->parent, c->screen->arrow); */
|
||||||
}
|
}
|
||||||
|
|
@ -490,10 +498,10 @@ focusin(XFocusChangeEvent *e)
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
curtime = CurrentTime;
|
curtime = CurrentTime;
|
||||||
if (e->detail != NotifyNonlinearVirtual)
|
if(e->detail != NotifyNonlinearVirtual)
|
||||||
return;
|
return;
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if (c != 0 && c->window == e->window && c != current) {
|
if(c != 0 && c->window == e->window && c != current){
|
||||||
/* someone grabbed keyboard or seized focus; make them current */
|
/* someone grabbed keyboard or seized focus; make them current */
|
||||||
XMapRaised(dpy, c->parent);
|
XMapRaised(dpy, c->parent);
|
||||||
top(c);
|
top(c);
|
||||||
|
|
@ -504,60 +512,60 @@ focusin(XFocusChangeEvent *e)
|
||||||
BorderOrient
|
BorderOrient
|
||||||
borderorient(Client *c, int x, int y)
|
borderorient(Client *c, int x, int y)
|
||||||
{
|
{
|
||||||
if (x <= BORDER) {
|
if(x <= BORDER){
|
||||||
if (y <= CORNER) {
|
if(y <= CORNER){
|
||||||
if (debug) fprintf(stderr, "topleft\n");
|
if(debug) fprintf(stderr, "topleft\n");
|
||||||
return BorderWNW;
|
return BorderWNW;
|
||||||
}
|
}
|
||||||
if (y >= (c->dy + 2*BORDER) - CORNER) {
|
if(y >= (c->dy + 2*BORDER) - CORNER){
|
||||||
if (debug) fprintf(stderr, "botleft\n");
|
if(debug) fprintf(stderr, "botleft\n");
|
||||||
return BorderWSW;
|
return BorderWSW;
|
||||||
}
|
}
|
||||||
if (y > CORNER &&
|
if(y > CORNER &&
|
||||||
y < (c->dy + 2*BORDER) - CORNER) {
|
y < (c->dy + 2*BORDER) - CORNER){
|
||||||
if (debug) fprintf(stderr, "left\n");
|
if(debug) fprintf(stderr, "left\n");
|
||||||
return BorderW;
|
return BorderW;
|
||||||
}
|
}
|
||||||
} else if (x <= CORNER) {
|
} else if(x <= CORNER){
|
||||||
if (y <= BORDER) {
|
if(y <= BORDER){
|
||||||
if (debug) fprintf(stderr, "topleft\n");
|
if(debug) fprintf(stderr, "topleft\n");
|
||||||
return BorderNNW;
|
return BorderNNW;
|
||||||
}
|
}
|
||||||
if (y >= (c->dy + BORDER)) {
|
if (y >= (c->dy + BORDER)){
|
||||||
if (debug) fprintf(stderr, "botleft\n");
|
if(debug) fprintf(stderr, "botleft\n");
|
||||||
return BorderSSW;
|
return BorderSSW;
|
||||||
}
|
}
|
||||||
} else if (x >= (c->dx + BORDER)) {
|
} else if(x >= (c->dx + BORDER)){
|
||||||
if (y <= CORNER) {
|
if(y <= CORNER){
|
||||||
if (debug) fprintf(stderr, "topright\n");
|
if(debug) fprintf(stderr, "topright\n");
|
||||||
return BorderENE;
|
return BorderENE;
|
||||||
}
|
}
|
||||||
if (y >= (c->dy + 2*BORDER) - CORNER) {
|
if(y >= (c->dy + 2*BORDER) - CORNER){
|
||||||
if (debug) fprintf(stderr, "botright\n");
|
if(debug) fprintf(stderr, "botright\n");
|
||||||
return BorderESE;
|
return BorderESE;
|
||||||
}
|
}
|
||||||
if (y > CORNER &&
|
if(y > CORNER &&
|
||||||
y < (c->dy + 2*BORDER) - CORNER) {
|
y < (c->dy + 2*BORDER) - CORNER){
|
||||||
if (debug) fprintf(stderr, "right\n");
|
if(debug) fprintf(stderr, "right\n");
|
||||||
return BorderE;
|
return BorderE;
|
||||||
}
|
}
|
||||||
} else if (x >= (c->dx + 2*BORDER) - CORNER) {
|
} else if(x >= (c->dx + 2*BORDER) - CORNER){
|
||||||
if (y <= BORDER) {
|
if(y <= BORDER){
|
||||||
if (debug) fprintf(stderr, "topright\n");
|
if(debug) fprintf(stderr, "topright\n");
|
||||||
return BorderNNE;
|
return BorderNNE;
|
||||||
}
|
}
|
||||||
if (y >= (c->dy + BORDER)) {
|
if (y >= (c->dy + BORDER)){
|
||||||
if (debug) fprintf(stderr, "botright\n");
|
if(debug) fprintf(stderr, "botright\n");
|
||||||
return BorderSSE;
|
return BorderSSE;
|
||||||
}
|
}
|
||||||
} else if (x > CORNER &&
|
} else if(x > CORNER &&
|
||||||
x < (c->dx + 2*BORDER) - CORNER) {
|
x < (c->dx + 2*BORDER) - CORNER){
|
||||||
if (y <= BORDER) {
|
if(y <= BORDER){
|
||||||
if (debug) fprintf(stderr, "top\n");
|
if(debug) fprintf(stderr, "top\n");
|
||||||
return BorderN;
|
return BorderN;
|
||||||
}
|
}
|
||||||
if (y >= (c->dy + BORDER)) {
|
if(y >= (c->dy + BORDER)){
|
||||||
if (debug) fprintf(stderr, "bot\n");
|
if(debug) fprintf(stderr, "bot\n");
|
||||||
return BorderS;
|
return BorderS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -571,9 +579,9 @@ motionnotify(XMotionEvent *e)
|
||||||
BorderOrient bl;
|
BorderOrient bl;
|
||||||
|
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if (c) {
|
if(c){
|
||||||
bl = borderorient(c, e->x, e->y);
|
bl = borderorient(c, e->x, e->y);
|
||||||
if (bl == BorderUnknown)
|
if(bl == BorderUnknown)
|
||||||
XUndefineCursor(dpy, c->parent);
|
XUndefineCursor(dpy, c->parent);
|
||||||
else
|
else
|
||||||
XDefineCursor(dpy, c->parent, c->screen->bordcurs[bl]);
|
XDefineCursor(dpy, c->parent, c->screen->bordcurs[bl]);
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,11 @@ void setlabel();
|
||||||
void getproto();
|
void getproto();
|
||||||
void gettrans();
|
void gettrans();
|
||||||
|
|
||||||
|
/* key.c */
|
||||||
|
void keypress();
|
||||||
|
void keyrelease();
|
||||||
|
void keysetup();
|
||||||
|
|
||||||
/* menu.c */
|
/* menu.c */
|
||||||
void button();
|
void button();
|
||||||
void spawn();
|
void spawn();
|
||||||
|
|
@ -88,6 +93,7 @@ Client *getclient();
|
||||||
void rmclient();
|
void rmclient();
|
||||||
void dump_revert();
|
void dump_revert();
|
||||||
void dump_clients();
|
void dump_clients();
|
||||||
|
void shuffle(int);
|
||||||
|
|
||||||
/* grab.c */
|
/* grab.c */
|
||||||
int menuhit();
|
int menuhit();
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ grab(Window w, Window constrain, int mask, Cursor curs, int t)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (t == 0)
|
if(t == 0)
|
||||||
t = timestamp();
|
t = timestamp();
|
||||||
status = XGrabPointer(dpy, w, False, mask,
|
status = XGrabPointer(dpy, w, False, mask,
|
||||||
GrabModeAsync, GrabModeAsync, constrain, curs, t);
|
GrabModeAsync, GrabModeAsync, constrain, curs, t);
|
||||||
|
|
@ -33,13 +33,13 @@ ungrab(XButtonEvent *e)
|
||||||
{
|
{
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
|
|
||||||
if (!nobuttons(e))
|
if(!nobuttons(e))
|
||||||
for (;;) {
|
for(;;){
|
||||||
XMaskEvent(dpy, ButtonMask | ButtonMotionMask, &ev);
|
XMaskEvent(dpy, ButtonMask | ButtonMotionMask, &ev);
|
||||||
if (ev.type == MotionNotify)
|
if(ev.type == MotionNotify)
|
||||||
continue;
|
continue;
|
||||||
e = &ev.xbutton;
|
e = &ev.xbutton;
|
||||||
if (nobuttons(e))
|
if(nobuttons(e))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
XUngrabPointer(dpy, e->time);
|
XUngrabPointer(dpy, e->time);
|
||||||
|
|
@ -65,21 +65,21 @@ menuhit(XButtonEvent *e, Menu *m)
|
||||||
int x, y, dx, dy, xmax, ymax;
|
int x, y, dx, dy, xmax, ymax;
|
||||||
ScreenInfo *s;
|
ScreenInfo *s;
|
||||||
|
|
||||||
if (font == 0)
|
if(font == 0)
|
||||||
return -1;
|
return -1;
|
||||||
s = getscreen(e->root);
|
s = getscreen(e->root);
|
||||||
if (s == 0 || e->window == s->menuwin) /* ugly event mangling */
|
if(s == 0 || e->window == s->menuwin) /* ugly event mangling */
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
dx = 0;
|
dx = 0;
|
||||||
for (n = 0; m->item[n]; n++) {
|
for(n = 0; m->item[n]; n++){
|
||||||
wide = XTextWidth(font, m->item[n], strlen(m->item[n])) + 4;
|
wide = XTextWidth(font, m->item[n], strlen(m->item[n])) + 4;
|
||||||
if (wide > dx)
|
if(wide > dx)
|
||||||
dx = wide;
|
dx = wide;
|
||||||
}
|
}
|
||||||
wide = dx;
|
wide = dx;
|
||||||
cur = m->lasthit;
|
cur = m->lasthit;
|
||||||
if (cur >= n)
|
if(cur >= n)
|
||||||
cur = n - 1;
|
cur = n - 1;
|
||||||
|
|
||||||
high = font->ascent + font->descent + 1;
|
high = font->ascent + font->descent + 1;
|
||||||
|
|
@ -89,88 +89,88 @@ menuhit(XButtonEvent *e, Menu *m)
|
||||||
warp = 0;
|
warp = 0;
|
||||||
xmax = DisplayWidth(dpy, s->num);
|
xmax = DisplayWidth(dpy, s->num);
|
||||||
ymax = DisplayHeight(dpy, s->num);
|
ymax = DisplayHeight(dpy, s->num);
|
||||||
if (x < 0) {
|
if(x < 0){
|
||||||
e->x -= x;
|
e->x -= x;
|
||||||
x = 0;
|
x = 0;
|
||||||
warp++;
|
warp++;
|
||||||
}
|
}
|
||||||
if (x+wide >= xmax) {
|
if(x+wide >= xmax){
|
||||||
e->x -= x+wide-xmax;
|
e->x -= x+wide-xmax;
|
||||||
x = xmax-wide;
|
x = xmax-wide;
|
||||||
warp++;
|
warp++;
|
||||||
}
|
}
|
||||||
if (y < 0) {
|
if(y < 0){
|
||||||
e->y -= y;
|
e->y -= y;
|
||||||
y = 0;
|
y = 0;
|
||||||
warp++;
|
warp++;
|
||||||
}
|
}
|
||||||
if (y+dy >= ymax) {
|
if(y+dy >= ymax){
|
||||||
e->y -= y+dy-ymax;
|
e->y -= y+dy-ymax;
|
||||||
y = ymax-dy;
|
y = ymax-dy;
|
||||||
warp++;
|
warp++;
|
||||||
}
|
}
|
||||||
if (warp)
|
if(warp)
|
||||||
setmouse(e->x, e->y, s);
|
setmouse(e->x, e->y, s);
|
||||||
XMoveResizeWindow(dpy, s->menuwin, x, y, dx, dy);
|
XMoveResizeWindow(dpy, s->menuwin, x, y, dx, dy);
|
||||||
XSelectInput(dpy, s->menuwin, MenuMask);
|
XSelectInput(dpy, s->menuwin, MenuMask);
|
||||||
XMapRaised(dpy, s->menuwin);
|
XMapRaised(dpy, s->menuwin);
|
||||||
status = grab(s->menuwin, None, MenuGrabMask, None, e->time);
|
status = grab(s->menuwin, None, MenuGrabMask, None, e->time);
|
||||||
if (status != GrabSuccess) {
|
if(status != GrabSuccess){
|
||||||
/* graberror("menuhit", status); */
|
/* graberror("menuhit", status); */
|
||||||
XUnmapWindow(dpy, s->menuwin);
|
XUnmapWindow(dpy, s->menuwin);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
drawn = 0;
|
drawn = 0;
|
||||||
for (;;) {
|
for(;;){
|
||||||
XMaskEvent(dpy, MenuMask, &ev);
|
XMaskEvent(dpy, MenuMask, &ev);
|
||||||
switch (ev.type) {
|
switch (ev.type){
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "rio: menuhit: unknown ev.type %d\n", ev.type);
|
fprintf(stderr, "rio: menuhit: unknown ev.type %d\n", ev.type);
|
||||||
break;
|
break;
|
||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
break;
|
break;
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
if (ev.xbutton.button != e->button)
|
if(ev.xbutton.button != e->button)
|
||||||
break;
|
break;
|
||||||
x = ev.xbutton.x;
|
x = ev.xbutton.x;
|
||||||
y = ev.xbutton.y;
|
y = ev.xbutton.y;
|
||||||
i = y/high;
|
i = y/high;
|
||||||
if (cur >= 0 && y >= cur*high-3 && y < (cur+1)*high+3)
|
if(cur >= 0 && y >= cur*high-3 && y < (cur+1)*high+3)
|
||||||
i = cur;
|
i = cur;
|
||||||
if (x < 0 || x > wide || y < -3)
|
if(x < 0 || x > wide || y < -3)
|
||||||
i = -1;
|
i = -1;
|
||||||
else if (i < 0 || i >= n)
|
else if(i < 0 || i >= n)
|
||||||
i = -1;
|
i = -1;
|
||||||
else
|
else
|
||||||
m->lasthit = i;
|
m->lasthit = i;
|
||||||
if (!nobuttons(&ev.xbutton))
|
if(!nobuttons(&ev.xbutton))
|
||||||
i = -1;
|
i = -1;
|
||||||
ungrab(&ev.xbutton);
|
ungrab(&ev.xbutton);
|
||||||
XUnmapWindow(dpy, s->menuwin);
|
XUnmapWindow(dpy, s->menuwin);
|
||||||
return i;
|
return i;
|
||||||
case MotionNotify:
|
case MotionNotify:
|
||||||
if (!drawn)
|
if(!drawn)
|
||||||
break;
|
break;
|
||||||
x = ev.xbutton.x;
|
x = ev.xbutton.x;
|
||||||
y = ev.xbutton.y;
|
y = ev.xbutton.y;
|
||||||
old = cur;
|
old = cur;
|
||||||
cur = y/high;
|
cur = y/high;
|
||||||
if (old >= 0 && y >= old*high-3 && y < (old+1)*high+3)
|
if(old >= 0 && y >= old*high-3 && y < (old+1)*high+3)
|
||||||
cur = old;
|
cur = old;
|
||||||
if (x < 0 || x > wide || y < -3)
|
if(x < 0 || x > wide || y < -3)
|
||||||
cur = -1;
|
cur = -1;
|
||||||
else if (cur < 0 || cur >= n)
|
else if(cur < 0 || cur >= n)
|
||||||
cur = -1;
|
cur = -1;
|
||||||
if (cur == old)
|
if(cur == old)
|
||||||
break;
|
break;
|
||||||
if (old >= 0 && old < n)
|
if(old >= 0 && old < n)
|
||||||
drawstring(dpy, s, m, wide, high, old, 0);
|
drawstring(dpy, s, m, wide, high, old, 0);
|
||||||
if (cur >= 0 && cur < n)
|
if(cur >= 0 && cur < n)
|
||||||
drawstring(dpy, s, m, wide, high, cur, 1);
|
drawstring(dpy, s, m, wide, high, cur, 1);
|
||||||
break;
|
break;
|
||||||
case Expose:
|
case Expose:
|
||||||
XClearWindow(dpy, s->menuwin);
|
XClearWindow(dpy, s->menuwin);
|
||||||
for (i = 0; i < n; i++)
|
for(i = 0; i < n; i++)
|
||||||
drawstring(dpy, s, m, wide, high, i, cur==i);
|
drawstring(dpy, s, m, wide, high, i, cur==i);
|
||||||
drawn = 1;
|
drawn = 1;
|
||||||
}
|
}
|
||||||
|
|
@ -187,35 +187,35 @@ selectwin(int release, int *shift, ScreenInfo *s)
|
||||||
Client *c;
|
Client *c;
|
||||||
|
|
||||||
status = grab(s->root, s->root, ButtonMask, s->target, 0);
|
status = grab(s->root, s->root, ButtonMask, s->target, 0);
|
||||||
if (status != GrabSuccess) {
|
if(status != GrabSuccess){
|
||||||
graberror("selectwin", status); /* */
|
graberror("selectwin", status); /* */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
w = None;
|
w = None;
|
||||||
for (;;) {
|
for(;;){
|
||||||
XMaskEvent(dpy, ButtonMask, &ev);
|
XMaskEvent(dpy, ButtonMask, &ev);
|
||||||
e = &ev.xbutton;
|
e = &ev.xbutton;
|
||||||
switch (ev.type) {
|
switch (ev.type){
|
||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
if (e->button != Button3) {
|
if(e->button != Button3){
|
||||||
ungrab(e);
|
ungrab(e);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
w = e->subwindow;
|
w = e->subwindow;
|
||||||
if (!release) {
|
if(!release){
|
||||||
c = getclient(w, 0);
|
c = getclient(w, 0);
|
||||||
if (c == 0)
|
if(c == 0)
|
||||||
ungrab(e);
|
ungrab(e);
|
||||||
if (shift != 0)
|
if(shift != 0)
|
||||||
*shift = (e->state&ShiftMask) != 0;
|
*shift = (e->state&ShiftMask) != 0;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
ungrab(e);
|
ungrab(e);
|
||||||
if (e->button != Button3 || e->subwindow != w)
|
if(e->button != Button3 || e->subwindow != w)
|
||||||
return 0;
|
return 0;
|
||||||
if (shift != 0)
|
if(shift != 0)
|
||||||
*shift = (e->state&ShiftMask) != 0;
|
*shift = (e->state&ShiftMask) != 0;
|
||||||
return getclient(w, 0);
|
return getclient(w, 0);
|
||||||
}
|
}
|
||||||
|
|
@ -231,12 +231,12 @@ sweepcalc(Client *c, int x, int y, BorderOrient bl, int ignored)
|
||||||
dy = y - c->y;
|
dy = y - c->y;
|
||||||
sx = sy = 1;
|
sx = sy = 1;
|
||||||
x += dx;
|
x += dx;
|
||||||
if (dx < 0) {
|
if(dx < 0){
|
||||||
dx = -dx;
|
dx = -dx;
|
||||||
sx = -1;
|
sx = -1;
|
||||||
}
|
}
|
||||||
y += dy;
|
y += dy;
|
||||||
if (dy < 0) {
|
if(dy < 0){
|
||||||
dy = -dy;
|
dy = -dy;
|
||||||
sy = -1;
|
sy = -1;
|
||||||
}
|
}
|
||||||
|
|
@ -244,22 +244,22 @@ sweepcalc(Client *c, int x, int y, BorderOrient bl, int ignored)
|
||||||
dx -= 2*BORDER;
|
dx -= 2*BORDER;
|
||||||
dy -= 2*BORDER;
|
dy -= 2*BORDER;
|
||||||
|
|
||||||
if (!c->is9term) {
|
if(!c->is9term){
|
||||||
if (dx < c->min_dx)
|
if(dx < c->min_dx)
|
||||||
dx = c->min_dx;
|
dx = c->min_dx;
|
||||||
if (dy < c->min_dy)
|
if(dy < c->min_dy)
|
||||||
dy = c->min_dy;
|
dy = c->min_dy;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->size.flags & PResizeInc) {
|
if(c->size.flags & PResizeInc){
|
||||||
dx = c->min_dx + (dx-c->min_dx)/c->size.width_inc*c->size.width_inc;
|
dx = c->min_dx + (dx-c->min_dx)/c->size.width_inc*c->size.width_inc;
|
||||||
dy = c->min_dy + (dy-c->min_dy)/c->size.height_inc*c->size.height_inc;
|
dy = c->min_dy + (dy-c->min_dy)/c->size.height_inc*c->size.height_inc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->size.flags & PMaxSize) {
|
if(c->size.flags & PMaxSize){
|
||||||
if (dx > c->size.max_width)
|
if(dx > c->size.max_width)
|
||||||
dx = c->size.max_width;
|
dx = c->size.max_width;
|
||||||
if (dy > c->size.max_height)
|
if(dy > c->size.max_height)
|
||||||
dy = c->size.max_height;
|
dy = c->size.max_height;
|
||||||
}
|
}
|
||||||
c->dx = sx*(dx + 2*BORDER);
|
c->dx = sx*(dx + 2*BORDER);
|
||||||
|
|
@ -291,7 +291,7 @@ pullcalc(Client *c, int x, int y, BorderOrient bl, int init)
|
||||||
xoff = yoff = 0;
|
xoff = yoff = 0;
|
||||||
xcorn = ycorn = 0;
|
xcorn = ycorn = 0;
|
||||||
|
|
||||||
switch(bl) {
|
switch(bl){
|
||||||
case BorderN:
|
case BorderN:
|
||||||
py = y;
|
py = y;
|
||||||
dy = (c->y + c->dy) - y;
|
dy = (c->y + c->dy) - y;
|
||||||
|
|
@ -351,7 +351,7 @@ pullcalc(Client *c, int x, int y, BorderOrient bl, int init)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
switch(bl) {
|
switch(bl){
|
||||||
case BorderNNW:
|
case BorderNNW:
|
||||||
case BorderNNE:
|
case BorderNNE:
|
||||||
case BorderSSW:
|
case BorderSSW:
|
||||||
|
|
@ -365,21 +365,21 @@ pullcalc(Client *c, int x, int y, BorderOrient bl, int init)
|
||||||
ycorn = 1;
|
ycorn = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!init
|
if(!init
|
||||||
|| xoff < 0 || (xcorn && xoff > CORNER) || (!xcorn && xoff > BORDER)
|
|| xoff < 0 || (xcorn && xoff > CORNER) || (!xcorn && xoff > BORDER)
|
||||||
|| yoff < 0 || (ycorn && yoff > CORNER) || (!ycorn && yoff > BORDER)) {
|
|| yoff < 0 || (ycorn && yoff > CORNER) || (!ycorn && yoff > BORDER)){
|
||||||
xoff = 0;
|
xoff = 0;
|
||||||
yoff = 0;
|
yoff = 0;
|
||||||
init = 0;
|
init = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug) fprintf(stderr, "c %dx%d+%d+%d m +%d+%d r %dx%d+%d+%d sp (%d,%d) bl %d\n",
|
if(debug) fprintf(stderr, "c %dx%d+%d+%d m +%d+%d r %dx%d+%d+%d sp (%d,%d) bl %d\n",
|
||||||
c->dx, c->dy, c->x, c->y, x, y, dx, dy, px, py, spx, spy, bl);
|
c->dx, c->dy, c->x, c->y, x, y, dx, dy, px, py, spx, spy, bl);
|
||||||
if (dx < 0) {
|
if(dx < 0){
|
||||||
dx = -dx;
|
dx = -dx;
|
||||||
sx = -1;
|
sx = -1;
|
||||||
}
|
}
|
||||||
if (dy < 0) {
|
if(dy < 0){
|
||||||
dy = -dy;
|
dy = -dy;
|
||||||
sy = -1;
|
sy = -1;
|
||||||
}
|
}
|
||||||
|
|
@ -394,22 +394,22 @@ pullcalc(Client *c, int x, int y, BorderOrient bl, int init)
|
||||||
dx -= (2*BORDER - xoff);
|
dx -= (2*BORDER - xoff);
|
||||||
dy -= (2*BORDER - yoff);
|
dy -= (2*BORDER - yoff);
|
||||||
|
|
||||||
if (!c->is9term) {
|
if(!c->is9term){
|
||||||
if (dx < c->min_dx)
|
if(dx < c->min_dx)
|
||||||
dx = c->min_dx;
|
dx = c->min_dx;
|
||||||
if (dy < c->min_dy)
|
if(dy < c->min_dy)
|
||||||
dy = c->min_dy;
|
dy = c->min_dy;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->size.flags & PResizeInc) {
|
if(c->size.flags & PResizeInc){
|
||||||
dx = c->min_dx + (dx-c->min_dx)/c->size.width_inc*c->size.width_inc;
|
dx = c->min_dx + (dx-c->min_dx)/c->size.width_inc*c->size.width_inc;
|
||||||
dy = c->min_dy + (dy-c->min_dy)/c->size.height_inc*c->size.height_inc;
|
dy = c->min_dy + (dy-c->min_dy)/c->size.height_inc*c->size.height_inc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->size.flags & PMaxSize) {
|
if(c->size.flags & PMaxSize){
|
||||||
if (dx > c->size.max_width)
|
if(dx > c->size.max_width)
|
||||||
dx = c->size.max_width;
|
dx = c->size.max_width;
|
||||||
if (dy > c->size.max_height)
|
if(dy > c->size.max_height)
|
||||||
dy = c->size.max_height;
|
dy = c->size.max_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -443,22 +443,22 @@ drawbound(Client *c, int drawing)
|
||||||
int x, y, dx, dy;
|
int x, y, dx, dy;
|
||||||
ScreenInfo *s;
|
ScreenInfo *s;
|
||||||
|
|
||||||
if (debug) fprintf(stderr, "drawbound %d %dx%d+%d+%d\n", drawing, c->dx, c->dy, c->x, c->y);
|
if(debug) fprintf(stderr, "drawbound %d %dx%d+%d+%d\n", drawing, c->dx, c->dy, c->x, c->y);
|
||||||
|
|
||||||
s = c->screen;
|
s = c->screen;
|
||||||
x = c->x;
|
x = c->x;
|
||||||
y = c->y;
|
y = c->y;
|
||||||
dx = c->dx;
|
dx = c->dx;
|
||||||
dy = c->dy;
|
dy = c->dy;
|
||||||
if (dx < 0) {
|
if(dx < 0){
|
||||||
x += dx;
|
x += dx;
|
||||||
dx = -dx;
|
dx = -dx;
|
||||||
}
|
}
|
||||||
if (dy < 0) {
|
if(dy < 0){
|
||||||
y += dy;
|
y += dy;
|
||||||
dy = -dy;
|
dy = -dy;
|
||||||
}
|
}
|
||||||
if (dx <= 2 || dy <= 2)
|
if(dx <= 2 || dy <= 2)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(solidsweep){
|
if(solidsweep){
|
||||||
|
|
@ -525,22 +525,22 @@ sweepdrag(Client *c, int but, XButtonEvent *e0, BorderOrient bl, int (*recalc)(C
|
||||||
c->y -= BORDER;
|
c->y -= BORDER;
|
||||||
c->dx += 2*BORDER;
|
c->dx += 2*BORDER;
|
||||||
c->dy += 2*BORDER;
|
c->dy += 2*BORDER;
|
||||||
if (bl != BorderUnknown || e0 == 0)
|
if(bl != BorderUnknown || e0 == 0)
|
||||||
getmouse(&cx, &cy, c->screen);
|
getmouse(&cx, &cy, c->screen);
|
||||||
else
|
else
|
||||||
getmouse(&c->x, &c->y, c->screen);
|
getmouse(&c->x, &c->y, c->screen);
|
||||||
XGrabServer(dpy);
|
XGrabServer(dpy);
|
||||||
if (bl != BorderUnknown) {
|
if(bl != BorderUnknown){
|
||||||
notmoved = recalc(c, cx, cy, bl, notmoved);
|
notmoved = recalc(c, cx, cy, bl, notmoved);
|
||||||
}
|
}
|
||||||
drawbound(c, 1);
|
drawbound(c, 1);
|
||||||
idle = 0;
|
idle = 0;
|
||||||
for (;;) {
|
for(;;){
|
||||||
if (XCheckMaskEvent(dpy, ButtonMask, &ev) == 0) {
|
if(XCheckMaskEvent(dpy, ButtonMask, &ev) == 0){
|
||||||
getmouse(&rx, &ry, c->screen);
|
getmouse(&rx, &ry, c->screen);
|
||||||
if (rx != cx || ry != cy || ++idle > 300) {
|
if(rx != cx || ry != cy || ++idle > 300){
|
||||||
drawbound(c, 0);
|
drawbound(c, 0);
|
||||||
if (rx == cx && ry == cy) {
|
if(rx == cx && ry == cy){
|
||||||
XUngrabServer(dpy);
|
XUngrabServer(dpy);
|
||||||
XFlush(dpy);
|
XFlush(dpy);
|
||||||
misleep(500);
|
misleep(500);
|
||||||
|
|
@ -560,19 +560,19 @@ sweepdrag(Client *c, int but, XButtonEvent *e0, BorderOrient bl, int (*recalc)(C
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
e = &ev.xbutton;
|
e = &ev.xbutton;
|
||||||
switch (ev.type) {
|
switch (ev.type){
|
||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
drawbound(c, 0);
|
drawbound(c, 0);
|
||||||
ungrab(e);
|
ungrab(e);
|
||||||
XUngrabServer(dpy);
|
XUngrabServer(dpy);
|
||||||
if (e->button != but && c->init)
|
if(e->button != but && c->init)
|
||||||
goto bad;
|
goto bad;
|
||||||
if (c->dx < 0) {
|
if(c->dx < 0){
|
||||||
c->x += c->dx;
|
c->x += c->dx;
|
||||||
c->dx = -c->dx;
|
c->dx = -c->dx;
|
||||||
}
|
}
|
||||||
if (c->dy < 0) {
|
if(c->dy < 0){
|
||||||
c->y += c->dy;
|
c->y += c->dy;
|
||||||
c->dy = -c->dy;
|
c->dy = -c->dy;
|
||||||
}
|
}
|
||||||
|
|
@ -580,13 +580,13 @@ sweepdrag(Client *c, int but, XButtonEvent *e0, BorderOrient bl, int (*recalc)(C
|
||||||
c->y += BORDER;
|
c->y += BORDER;
|
||||||
c->dx -= 2*BORDER;
|
c->dx -= 2*BORDER;
|
||||||
c->dy -= 2*BORDER;
|
c->dy -= 2*BORDER;
|
||||||
if (c->dx < 4 || c->dy < 4 || c->dx < c->min_dx || c->dy < c->min_dy)
|
if(c->dx < 4 || c->dy < 4 || c->dx < c->min_dx || c->dy < c->min_dy)
|
||||||
goto bad;
|
goto bad;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bad:
|
bad:
|
||||||
if (debug) fprintf(stderr, "sweepdrag bad\n");
|
if(debug) fprintf(stderr, "sweepdrag bad\n");
|
||||||
c->x = ox;
|
c->x = ox;
|
||||||
c->y = oy;
|
c->y = oy;
|
||||||
c->dx = odx;
|
c->dx = odx;
|
||||||
|
|
@ -607,14 +607,14 @@ sweep(Client *c, int but, XButtonEvent *ignored)
|
||||||
c->dx = 0;
|
c->dx = 0;
|
||||||
c->dy = 0;
|
c->dy = 0;
|
||||||
status = grab(s->root, s->root, ButtonMask, s->sweep0, 0);
|
status = grab(s->root, s->root, ButtonMask, s->sweep0, 0);
|
||||||
if (status != GrabSuccess) {
|
if(status != GrabSuccess){
|
||||||
graberror("sweep", status); /* */
|
graberror("sweep", status); /* */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
XMaskEvent(dpy, ButtonMask, &ev);
|
XMaskEvent(dpy, ButtonMask, &ev);
|
||||||
e = &ev.xbutton;
|
e = &ev.xbutton;
|
||||||
if (e->button != but) {
|
if(e->button != but){
|
||||||
ungrab(e);
|
ungrab(e);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -634,7 +634,7 @@ pull(Client *c, int but, XButtonEvent *e)
|
||||||
|
|
||||||
s = c->screen;
|
s = c->screen;
|
||||||
status = grab(s->root, s->root, ButtonMask, s->bordcurs[bl], 0);
|
status = grab(s->root, s->root, ButtonMask, s->bordcurs[bl], 0);
|
||||||
if (status != GrabSuccess) {
|
if(status != GrabSuccess){
|
||||||
graberror("pull", status); /* */
|
graberror("pull", status); /* */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -650,7 +650,7 @@ drag(Client *c, int but)
|
||||||
|
|
||||||
s = c->screen;
|
s = c->screen;
|
||||||
status = grab(s->root, s->root, ButtonMask, s->boxcurs, 0);
|
status = grab(s->root, s->root, ButtonMask, s->boxcurs, 0);
|
||||||
if (status != GrabSuccess) {
|
if(status != GrabSuccess){
|
||||||
graberror("drag", status); /* */
|
graberror("drag", status); /* */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -665,7 +665,7 @@ getmouse(int *x, int *y, ScreenInfo *s)
|
||||||
unsigned int t3;
|
unsigned int t3;
|
||||||
|
|
||||||
XQueryPointer(dpy, s->root, &dw1, &dw2, x, y, &t1, &t2, &t3);
|
XQueryPointer(dpy, s->root, &dw1, &dw2, x, y, &t1, &t2, &t3);
|
||||||
if (debug) fprintf(stderr, "getmouse: %d %d\n", *x, *y);
|
if(debug) fprintf(stderr, "getmouse: %d %d\n", *x, *y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -88,83 +88,83 @@ main(int argc, char *argv[])
|
||||||
background = 0;
|
background = 0;
|
||||||
font = 0;
|
font = 0;
|
||||||
fname = 0;
|
fname = 0;
|
||||||
for (i = 1; i < argc; i++)
|
for(i = 1; i < argc; i++)
|
||||||
if (strcmp(argv[i], "-nostalgia") == 0)
|
if(strcmp(argv[i], "-nostalgia") == 0)
|
||||||
nostalgia++;
|
nostalgia++;
|
||||||
else if (strcmp(argv[i], "-grey") == 0)
|
else if(strcmp(argv[i], "-grey") == 0)
|
||||||
background = 1;
|
background = 1;
|
||||||
else if (strcmp(argv[i], "-debug") == 0)
|
else if(strcmp(argv[i], "-debug") == 0)
|
||||||
debug++;
|
debug++;
|
||||||
else if (strcmp(argv[i], "-font") == 0 && i+1<argc) {
|
else if(strcmp(argv[i], "-font") == 0 && i+1<argc){
|
||||||
i++;
|
i++;
|
||||||
fname = argv[i];
|
fname = argv[i];
|
||||||
}
|
}
|
||||||
else if (strcmp(argv[i], "-term") == 0 && i+1<argc)
|
else if(strcmp(argv[i], "-term") == 0 && i+1<argc)
|
||||||
termprog = argv[++i];
|
termprog = argv[++i];
|
||||||
else if (strcmp(argv[i], "-virtuals") == 0 && i+1<argc) {
|
else if(strcmp(argv[i], "-virtuals") == 0 && i+1<argc){
|
||||||
numvirtuals = atoi(argv[++i]);
|
numvirtuals = atoi(argv[++i]);
|
||||||
if(numvirtuals < 0 || numvirtuals > 12) {
|
if(numvirtuals < 0 || numvirtuals > 12){
|
||||||
fprintf(stderr, "rio: wrong number of virtual displays, defaulting to 4\n");
|
fprintf(stderr, "rio: wrong number of virtual displays, defaulting to 4\n");
|
||||||
numvirtuals = 4;
|
numvirtuals = 4;
|
||||||
}
|
}
|
||||||
} else if (strcmp(argv[i], "-version") == 0) {
|
} else if(strcmp(argv[i], "-version") == 0){
|
||||||
fprintf(stderr, "%s", version[0]);
|
fprintf(stderr, "%s", version[0]);
|
||||||
if (PATCHLEVEL > 0)
|
if(PATCHLEVEL > 0)
|
||||||
fprintf(stderr, "; patch level %d", PATCHLEVEL);
|
fprintf(stderr, "; patch level %d", PATCHLEVEL);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
else if (strcmp(argv[i], "-s") == 0) {
|
else if(strcmp(argv[i], "-s") == 0){
|
||||||
scrolling = 1;
|
scrolling = 1;
|
||||||
}
|
}
|
||||||
else if (argv[i][0] == '-')
|
else if(argv[i][0] == '-')
|
||||||
usage();
|
usage();
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
for (; i < argc; i++)
|
for(; i < argc; i++)
|
||||||
if (strcmp(argv[i], "exit") == 0)
|
if(strcmp(argv[i], "exit") == 0)
|
||||||
do_exit++;
|
do_exit++;
|
||||||
else if (strcmp(argv[i], "restart") == 0)
|
else if(strcmp(argv[i], "restart") == 0)
|
||||||
do_restart++;
|
do_restart++;
|
||||||
else
|
else
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
if (do_exit && do_restart)
|
if(do_exit && do_restart)
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
shell = (char *)getenv("SHELL");
|
shell = (char *)getenv("SHELL");
|
||||||
if (shell == NULL)
|
if(shell == NULL)
|
||||||
shell = DEFSHELL;
|
shell = DEFSHELL;
|
||||||
|
|
||||||
dpy = XOpenDisplay("");
|
dpy = XOpenDisplay("");
|
||||||
if (dpy == 0)
|
if(dpy == 0)
|
||||||
fatal("can't open display");
|
fatal("can't open display");
|
||||||
|
|
||||||
initting = 1;
|
initting = 1;
|
||||||
XSetErrorHandler(handler);
|
XSetErrorHandler(handler);
|
||||||
if (signal(SIGTERM, sighandler) == SIG_IGN)
|
if(signal(SIGTERM, sighandler) == SIG_IGN)
|
||||||
signal(SIGTERM, SIG_IGN);
|
signal(SIGTERM, SIG_IGN);
|
||||||
if (signal(SIGINT, sighandler) == SIG_IGN)
|
if(signal(SIGINT, sighandler) == SIG_IGN)
|
||||||
signal(SIGINT, SIG_IGN);
|
signal(SIGINT, SIG_IGN);
|
||||||
if (signal(SIGHUP, sighandler) == SIG_IGN)
|
if(signal(SIGHUP, sighandler) == SIG_IGN)
|
||||||
signal(SIGHUP, SIG_IGN);
|
signal(SIGHUP, SIG_IGN);
|
||||||
|
|
||||||
exit_rio = XInternAtom(dpy, "9WM_EXIT", False);
|
exit_rio = XInternAtom(dpy, "9WM_EXIT", False);
|
||||||
restart_rio = XInternAtom(dpy, "9WM_RESTART", False);
|
restart_rio = XInternAtom(dpy, "9WM_RESTART", False);
|
||||||
|
|
||||||
curtime = -1; /* don't care */
|
curtime = -1; /* don't care */
|
||||||
if (do_exit) {
|
if(do_exit){
|
||||||
sendcmessage(DefaultRootWindow(dpy), exit_rio, 0L, 1, 1);
|
sendcmessage(DefaultRootWindow(dpy), exit_rio, 0L, 1, 1);
|
||||||
XSync(dpy, False);
|
XSync(dpy, False);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
if (do_restart) {
|
if(do_restart){
|
||||||
sendcmessage(DefaultRootWindow(dpy), restart_rio, 0L, 1, 1);
|
sendcmessage(DefaultRootWindow(dpy), restart_rio, 0L, 1, 1);
|
||||||
XSync(dpy, False);
|
XSync(dpy, False);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0) XSynchronize(dpy, True);
|
if(0) XSynchronize(dpy, True);
|
||||||
|
|
||||||
wm_state = XInternAtom(dpy, "WM_STATE", False);
|
wm_state = XInternAtom(dpy, "WM_STATE", False);
|
||||||
wm_change_state = XInternAtom(dpy, "WM_CHANGE_STATE", False);
|
wm_change_state = XInternAtom(dpy, "WM_CHANGE_STATE", False);
|
||||||
|
|
@ -176,24 +176,24 @@ main(int argc, char *argv[])
|
||||||
_rio_running = XInternAtom(dpy, "_9WM_RUNNING", False);
|
_rio_running = XInternAtom(dpy, "_9WM_RUNNING", False);
|
||||||
_rio_hold_mode = XInternAtom(dpy, "_9WM_HOLD_MODE", False);
|
_rio_hold_mode = XInternAtom(dpy, "_9WM_HOLD_MODE", False);
|
||||||
|
|
||||||
if (fname != 0)
|
if(fname != 0)
|
||||||
if ((font = XLoadQueryFont(dpy, fname)) == 0)
|
if((font = XLoadQueryFont(dpy, fname)) == 0)
|
||||||
fprintf(stderr, "rio: warning: can't load font %s\n", fname);
|
fprintf(stderr, "rio: warning: can't load font %s\n", fname);
|
||||||
|
|
||||||
if (font == 0) {
|
if(font == 0){
|
||||||
i = 0;
|
i = 0;
|
||||||
for (;;) {
|
for(;;){
|
||||||
fname = fontlist[i++];
|
fname = fontlist[i++];
|
||||||
if (fname == 0) {
|
if(fname == 0){
|
||||||
fprintf(stderr, "rio: warning: can't find a font\n");
|
fprintf(stderr, "rio: warning: can't find a font\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
font = XLoadQueryFont(dpy, fname);
|
font = XLoadQueryFont(dpy, fname);
|
||||||
if (font != 0)
|
if(font != 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (nostalgia) {
|
if(nostalgia){
|
||||||
_border--;
|
_border--;
|
||||||
_inset--;
|
_inset--;
|
||||||
}
|
}
|
||||||
|
|
@ -205,7 +205,7 @@ main(int argc, char *argv[])
|
||||||
num_screens = ScreenCount(dpy);
|
num_screens = ScreenCount(dpy);
|
||||||
screens = (ScreenInfo *)malloc(sizeof(ScreenInfo) * num_screens);
|
screens = (ScreenInfo *)malloc(sizeof(ScreenInfo) * num_screens);
|
||||||
|
|
||||||
for (i = 0; i < num_screens; i++)
|
for(i = 0; i < num_screens; i++)
|
||||||
initscreen(&screens[i], i, background);
|
initscreen(&screens[i], i, background);
|
||||||
|
|
||||||
initb2menu(numvirtuals);
|
initb2menu(numvirtuals);
|
||||||
|
|
@ -219,9 +219,10 @@ main(int argc, char *argv[])
|
||||||
|
|
||||||
nofocus();
|
nofocus();
|
||||||
|
|
||||||
for (i = 0; i < num_screens; i++)
|
for(i = 0; i < num_screens; i++)
|
||||||
scanwins(&screens[i]);
|
scanwins(&screens[i]);
|
||||||
|
|
||||||
|
keysetup();
|
||||||
mainloop(shape_event);
|
mainloop(shape_event);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -277,18 +278,18 @@ initscreen(ScreenInfo *s, int i, int background)
|
||||||
}
|
}
|
||||||
s->vis = DefaultVisual(dpy, i);
|
s->vis = DefaultVisual(dpy, i);
|
||||||
}
|
}
|
||||||
if(DefaultDepth(dpy, i) != s->depth) {
|
if(DefaultDepth(dpy, i) != s->depth){
|
||||||
s->def_cmap = XCreateColormap(dpy, s->root, s->vis, AllocNone);
|
s->def_cmap = XCreateColormap(dpy, s->root, s->vis, AllocNone);
|
||||||
}
|
}
|
||||||
|
|
||||||
ds = DisplayString(dpy);
|
ds = DisplayString(dpy);
|
||||||
colon = rindex(ds, ':');
|
colon = rindex(ds, ':');
|
||||||
if (colon && num_screens > 1) {
|
if(colon && num_screens > 1){
|
||||||
strcpy(s->display, "DISPLAY=");
|
strcpy(s->display, "DISPLAY=");
|
||||||
strcat(s->display, ds);
|
strcat(s->display, ds);
|
||||||
colon = s->display + 8 + (colon - ds); /* use version in buf */
|
colon = s->display + 8 + (colon - ds); /* use version in buf */
|
||||||
dot1 = index(colon, '.'); /* first period after colon */
|
dot1 = index(colon, '.'); /* first period after colon */
|
||||||
if (!dot1)
|
if(!dot1)
|
||||||
dot1 = colon + strlen(colon); /* if not there, append */
|
dot1 = colon + strlen(colon); /* if not there, append */
|
||||||
sprintf(dot1, ".%d", i);
|
sprintf(dot1, ".%d", i);
|
||||||
}
|
}
|
||||||
|
|
@ -314,7 +315,7 @@ initscreen(ScreenInfo *s, int i, int background)
|
||||||
gv.subwindow_mode = IncludeInferiors;
|
gv.subwindow_mode = IncludeInferiors;
|
||||||
gmask = GCForeground | GCBackground | GCFunction | GCLineWidth
|
gmask = GCForeground | GCBackground | GCFunction | GCLineWidth
|
||||||
| GCSubwindowMode;
|
| GCSubwindowMode;
|
||||||
if (font != 0) {
|
if(font != 0){
|
||||||
gv.font = font->fid;
|
gv.font = font->fid;
|
||||||
gmask |= GCFont;
|
gmask |= GCFont;
|
||||||
}
|
}
|
||||||
|
|
@ -339,7 +340,7 @@ initscreen(ScreenInfo *s, int i, int background)
|
||||||
XChangeWindowAttributes(dpy, s->root, mask, &attr);
|
XChangeWindowAttributes(dpy, s->root, mask, &attr);
|
||||||
XSync(dpy, False);
|
XSync(dpy, False);
|
||||||
|
|
||||||
if (background) {
|
if(background){
|
||||||
XSetWindowBackgroundPixmap(dpy, s->root, s->root_pixmap);
|
XSetWindowBackgroundPixmap(dpy, s->root, s->root_pixmap);
|
||||||
XClearWindow(dpy, s->root);
|
XClearWindow(dpy, s->root);
|
||||||
} else
|
} else
|
||||||
|
|
@ -389,8 +390,8 @@ getscreen(Window w)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < num_screens; i++)
|
for(i = 0; i < num_screens; i++)
|
||||||
if (screens[i].root == w)
|
if(screens[i].root == w)
|
||||||
return &screens[i];
|
return &screens[i];
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -401,7 +402,7 @@ timestamp(void)
|
||||||
{
|
{
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
|
|
||||||
if (curtime == CurrentTime) {
|
if(curtime == CurrentTime){
|
||||||
XChangeProperty(dpy, screens[0].root, _rio_running, _rio_running, 8,
|
XChangeProperty(dpy, screens[0].root, _rio_running, _rio_running, 8,
|
||||||
PropModeAppend, (unsigned char *)"", 0);
|
PropModeAppend, (unsigned char *)"", 0);
|
||||||
XMaskEvent(dpy, PropertyChangeMask, &ev);
|
XMaskEvent(dpy, PropertyChangeMask, &ev);
|
||||||
|
|
@ -427,13 +428,13 @@ sendcmessage(Window w, Atom a, long x, int isroot, int usemask)
|
||||||
mask = 0;
|
mask = 0;
|
||||||
if(usemask){
|
if(usemask){
|
||||||
mask |= KeyPressMask; /* seems to be necessary */
|
mask |= KeyPressMask; /* seems to be necessary */
|
||||||
if (isroot)
|
if(isroot)
|
||||||
mask |= SubstructureRedirectMask; /* magic! */
|
mask |= SubstructureRedirectMask; /* magic! */
|
||||||
else
|
else
|
||||||
mask |= ExposureMask; /* not really correct but so be it */
|
mask |= ExposureMask; /* not really correct but so be it */
|
||||||
}
|
}
|
||||||
status = XSendEvent(dpy, w, False, mask, &ev);
|
status = XSendEvent(dpy, w, False, mask, &ev);
|
||||||
if (status == 0)
|
if(status == 0)
|
||||||
fprintf(stderr, "rio: sendcmessage failed\n");
|
fprintf(stderr, "rio: sendcmessage failed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -468,8 +469,8 @@ getevent(XEvent *e)
|
||||||
fd_set rfds;
|
fd_set rfds;
|
||||||
struct timeval t;
|
struct timeval t;
|
||||||
|
|
||||||
if (!signalled) {
|
if(!signalled){
|
||||||
if (QLength(dpy) > 0) {
|
if(QLength(dpy) > 0){
|
||||||
XNextEvent(dpy, e);
|
XNextEvent(dpy, e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -477,17 +478,17 @@ getevent(XEvent *e)
|
||||||
FD_ZERO(&rfds);
|
FD_ZERO(&rfds);
|
||||||
FD_SET(fd, &rfds);
|
FD_SET(fd, &rfds);
|
||||||
t.tv_sec = t.tv_usec = 0;
|
t.tv_sec = t.tv_usec = 0;
|
||||||
if (select(fd+1, &rfds, NULL, NULL, &t) == 1) {
|
if(select(fd+1, &rfds, NULL, NULL, &t) == 1){
|
||||||
XNextEvent(dpy, e);
|
XNextEvent(dpy, e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
XFlush(dpy);
|
XFlush(dpy);
|
||||||
FD_SET(fd, &rfds);
|
FD_SET(fd, &rfds);
|
||||||
if (select(fd+1, &rfds, NULL, NULL, NULL) == 1) {
|
if(select(fd+1, &rfds, NULL, NULL, NULL) == 1){
|
||||||
XNextEvent(dpy, e);
|
XNextEvent(dpy, e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (errno != EINTR || !signalled) {
|
if(errno != EINTR || !signalled){
|
||||||
perror("rio: select failed");
|
perror("rio: select failed");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
@ -506,16 +507,16 @@ cleanup(void)
|
||||||
|
|
||||||
/* order of un-reparenting determines final stacking order... */
|
/* order of un-reparenting determines final stacking order... */
|
||||||
cc[0] = cc[1] = 0;
|
cc[0] = cc[1] = 0;
|
||||||
for (c = clients; c; c = next) {
|
for(c = clients; c; c = next){
|
||||||
next = c->next;
|
next = c->next;
|
||||||
i = normal(c);
|
i = normal(c);
|
||||||
c->next = cc[i];
|
c->next = cc[i];
|
||||||
cc[i] = c;
|
cc[i] = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
for(i = 0; i < 2; i++){
|
||||||
for (c = cc[i]; c; c = c->next) {
|
for(c = cc[i]; c; c = c->next){
|
||||||
if (!withdrawn(c)) {
|
if(!withdrawn(c)){
|
||||||
gravitate(c, 1);
|
gravitate(c, 1);
|
||||||
XReparentWindow(dpy, c->window, c->screen->root,
|
XReparentWindow(dpy, c->window, c->screen->root,
|
||||||
c->x, c->y);
|
c->x, c->y);
|
||||||
|
|
@ -526,7 +527,7 @@ cleanup(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, timestamp());
|
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, timestamp());
|
||||||
for (i = 0; i < num_screens; i++)
|
for(i = 0; i < num_screens; i++)
|
||||||
cmapnofocus(&screens[i]);
|
cmapnofocus(&screens[i]);
|
||||||
XCloseDisplay(dpy);
|
XCloseDisplay(dpy);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,7 @@
|
||||||
|
/*
|
||||||
|
* Window management.
|
||||||
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 1994-1996 David Hogan, see README for licence details */
|
/* Copyright (c) 1994-1996 David Hogan, see README for licence details */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
@ -26,7 +30,7 @@ manage(Client *c, int mapped)
|
||||||
|
|
||||||
/* Get loads of hints */
|
/* Get loads of hints */
|
||||||
|
|
||||||
if (XGetClassHint(dpy, c->window, &class) != 0) { /* ``Success'' */
|
if(XGetClassHint(dpy, c->window, &class) != 0){ /* ``Success'' */
|
||||||
c->instance = class.res_name;
|
c->instance = class.res_name;
|
||||||
c->class = class.res_class;
|
c->class = class.res_class;
|
||||||
c->is9term = 0;
|
c->is9term = 0;
|
||||||
|
|
@ -45,63 +49,63 @@ manage(Client *c, int mapped)
|
||||||
setlabel(c);
|
setlabel(c);
|
||||||
|
|
||||||
hints = XGetWMHints(dpy, c->window);
|
hints = XGetWMHints(dpy, c->window);
|
||||||
if (XGetWMNormalHints(dpy, c->window, &c->size, &msize) == 0 || c->size.flags == 0)
|
if(XGetWMNormalHints(dpy, c->window, &c->size, &msize) == 0 || c->size.flags == 0)
|
||||||
c->size.flags = PSize; /* not specified - punt */
|
c->size.flags = PSize; /* not specified - punt */
|
||||||
|
|
||||||
getcmaps(c);
|
getcmaps(c);
|
||||||
getproto(c);
|
getproto(c);
|
||||||
gettrans(c);
|
gettrans(c);
|
||||||
if (c->is9term)
|
if(c->is9term)
|
||||||
c->hold = getiprop(c->window, _rio_hold_mode);
|
c->hold = getiprop(c->window, _rio_hold_mode);
|
||||||
|
|
||||||
/* Figure out what to do with the window from hints */
|
/* Figure out what to do with the window from hints */
|
||||||
|
|
||||||
if (!getstate(c->window, &state))
|
if(!getstate(c->window, &state))
|
||||||
state = hints ? hints->initial_state : NormalState;
|
state = hints ? hints->initial_state : NormalState;
|
||||||
dohide = (state == IconicState);
|
dohide = (state == IconicState);
|
||||||
|
|
||||||
fixsize = 0;
|
fixsize = 0;
|
||||||
if ((c->size.flags & (USSize|PSize)))
|
if((c->size.flags & (USSize|PSize)))
|
||||||
fixsize = 1;
|
fixsize = 1;
|
||||||
if ((c->size.flags & (PMinSize|PMaxSize)) == (PMinSize|PMaxSize) && c->size.min_width == c->size.max_width && c->size.min_height == c->size.max_height)
|
if((c->size.flags & (PMinSize|PMaxSize)) == (PMinSize|PMaxSize) && c->size.min_width == c->size.max_width && c->size.min_height == c->size.max_height)
|
||||||
fixsize = 1;
|
fixsize = 1;
|
||||||
doreshape = !mapped;
|
doreshape = !mapped;
|
||||||
if (fixsize) {
|
if(fixsize){
|
||||||
if (c->size.flags & USPosition)
|
if(c->size.flags & USPosition)
|
||||||
doreshape = 0;
|
doreshape = 0;
|
||||||
if (dohide && (c->size.flags & PPosition))
|
if(dohide && (c->size.flags & PPosition))
|
||||||
doreshape = 0;
|
doreshape = 0;
|
||||||
if (c->trans != None)
|
if(c->trans != None)
|
||||||
doreshape = 0;
|
doreshape = 0;
|
||||||
}
|
}
|
||||||
if (c->is9term)
|
if(c->is9term)
|
||||||
fixsize = 0;
|
fixsize = 0;
|
||||||
if (c->size.flags & PBaseSize) {
|
if(c->size.flags & PBaseSize){
|
||||||
c->min_dx = c->size.base_width;
|
c->min_dx = c->size.base_width;
|
||||||
c->min_dy = c->size.base_height;
|
c->min_dy = c->size.base_height;
|
||||||
}
|
}
|
||||||
else if (c->size.flags & PMinSize) {
|
else if(c->size.flags & PMinSize){
|
||||||
c->min_dx = c->size.min_width;
|
c->min_dx = c->size.min_width;
|
||||||
c->min_dy = c->size.min_height;
|
c->min_dy = c->size.min_height;
|
||||||
}
|
}
|
||||||
else if (c->is9term) {
|
else if(c->is9term){
|
||||||
c->min_dx = 100;
|
c->min_dx = 100;
|
||||||
c->min_dy = 50;
|
c->min_dy = 50;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
c->min_dx = c->min_dy = 0;
|
c->min_dx = c->min_dy = 0;
|
||||||
|
|
||||||
if (hints)
|
if(hints)
|
||||||
XFree(hints);
|
XFree(hints);
|
||||||
|
|
||||||
/* Now do it!!! */
|
/* Now do it!!! */
|
||||||
|
|
||||||
if (doreshape) {
|
if(doreshape){
|
||||||
if(0) fprintf(stderr, "in doreshape is9term=%d fixsize=%d, x=%d, y=%d, min_dx=%d, min_dy=%d, dx=%d, dy=%d\n",
|
if(0) fprintf(stderr, "in doreshape is9term=%d fixsize=%d, x=%d, y=%d, min_dx=%d, min_dy=%d, dx=%d, dy=%d\n",
|
||||||
c->is9term, fixsize, c->x, c->y, c->min_dx, c->min_dy, c->dx, c->dy);
|
c->is9term, fixsize, c->x, c->y, c->min_dx, c->min_dy, c->dx, c->dy);
|
||||||
if (current && current->screen == c->screen)
|
if(current && current->screen == c->screen)
|
||||||
cmapnofocus(c->screen);
|
cmapnofocus(c->screen);
|
||||||
if (!c->is9term && c->x==0 && c->y==0) {
|
if(!c->is9term && c->x==0 && c->y==0){
|
||||||
static int nwin;
|
static int nwin;
|
||||||
|
|
||||||
c->x = 20*nwin+BORDER;
|
c->x = 20*nwin+BORDER;
|
||||||
|
|
@ -110,10 +114,10 @@ manage(Client *c, int mapped)
|
||||||
nwin %= 10;
|
nwin %= 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->is9term && !(fixsize ? drag(c, Button3) : sweep(c, Button3))) {
|
if(c->is9term && !(fixsize ? drag(c, Button3) : sweep(c, Button3))){
|
||||||
XKillClient(dpy, c->window);
|
XKillClient(dpy, c->window);
|
||||||
rmclient(c);
|
rmclient(c);
|
||||||
if (current && current->screen == c->screen)
|
if(current && current->screen == c->screen)
|
||||||
cmapfocus(current);
|
cmapfocus(current);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -135,9 +139,9 @@ manage(Client *c, int mapped)
|
||||||
&attrs);
|
&attrs);
|
||||||
|
|
||||||
XSelectInput(dpy, c->parent, SubstructureRedirectMask | SubstructureNotifyMask|ButtonPressMask| PointerMotionMask|LeaveWindowMask);
|
XSelectInput(dpy, c->parent, SubstructureRedirectMask | SubstructureNotifyMask|ButtonPressMask| PointerMotionMask|LeaveWindowMask);
|
||||||
if (mapped)
|
if(mapped)
|
||||||
c->reparenting = 1;
|
c->reparenting = 1;
|
||||||
if (doreshape && !fixsize)
|
if(doreshape && !fixsize)
|
||||||
XResizeWindow(dpy, c->window, c->dx, c->dy);
|
XResizeWindow(dpy, c->window, c->dx, c->dy);
|
||||||
XSetWindowBorderWidth(dpy, c->window, 0);
|
XSetWindowBorderWidth(dpy, c->window, 0);
|
||||||
|
|
||||||
|
|
@ -149,13 +153,13 @@ manage(Client *c, int mapped)
|
||||||
* (black (or white) border around black (or white) window
|
* (black (or white) border around black (or white) window
|
||||||
* is not very helpful.
|
* is not very helpful.
|
||||||
*/
|
*/
|
||||||
if (c->screen->depth <= 8) {
|
if(c->screen->depth <= 8){
|
||||||
XSetWindowBorderWidth(dpy, c->parent, 1);
|
XSetWindowBorderWidth(dpy, c->parent, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
XReparentWindow(dpy, c->window, c->parent, BORDER, BORDER);
|
XReparentWindow(dpy, c->window, c->parent, BORDER, BORDER);
|
||||||
#ifdef SHAPE
|
#ifdef SHAPE
|
||||||
if (shape) {
|
if(shape){
|
||||||
XShapeSelectInput(dpy, c->window, ShapeNotifyMask);
|
XShapeSelectInput(dpy, c->window, ShapeNotifyMask);
|
||||||
ignore_badwindow = 1; /* magic */
|
ignore_badwindow = 1; /* magic */
|
||||||
setshape(c);
|
setshape(c);
|
||||||
|
|
@ -163,21 +167,21 @@ manage(Client *c, int mapped)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
XAddToSaveSet(dpy, c->window);
|
XAddToSaveSet(dpy, c->window);
|
||||||
if (dohide)
|
if(dohide)
|
||||||
hide(c);
|
hide(c);
|
||||||
else {
|
else {
|
||||||
XMapWindow(dpy, c->window);
|
XMapWindow(dpy, c->window);
|
||||||
XMapWindow(dpy, c->parent);
|
XMapWindow(dpy, c->parent);
|
||||||
XUnmapWindow(dpy, c->screen->sweepwin);
|
XUnmapWindow(dpy, c->screen->sweepwin);
|
||||||
if (nostalgia || doreshape)
|
if(nostalgia || doreshape)
|
||||||
active(c);
|
active(c);
|
||||||
else if (c->trans != None && current && current->window == c->trans)
|
else if(c->trans != None && current && current->window == c->trans)
|
||||||
active(c);
|
active(c);
|
||||||
else
|
else
|
||||||
setactive(c, 0);
|
setactive(c, 0);
|
||||||
setstate(c, NormalState);
|
setstate(c, NormalState);
|
||||||
}
|
}
|
||||||
if (current && (current != c))
|
if(current && (current != c))
|
||||||
cmapfocus(current);
|
cmapfocus(current);
|
||||||
c->init = 1;
|
c->init = 1;
|
||||||
|
|
||||||
|
|
@ -202,12 +206,12 @@ scanwins(ScreenInfo *s)
|
||||||
XWindowAttributes attr;
|
XWindowAttributes attr;
|
||||||
|
|
||||||
XQueryTree(dpy, s->root, &dw1, &dw2, &wins, &nwins);
|
XQueryTree(dpy, s->root, &dw1, &dw2, &wins, &nwins);
|
||||||
for (i = 0; i < nwins; i++) {
|
for(i = 0; i < nwins; i++){
|
||||||
XGetWindowAttributes(dpy, wins[i], &attr);
|
XGetWindowAttributes(dpy, wins[i], &attr);
|
||||||
if (attr.override_redirect || wins[i] == s->menuwin)
|
if(attr.override_redirect || wins[i] == s->menuwin)
|
||||||
continue;
|
continue;
|
||||||
c = getclient(wins[i], 1);
|
c = getclient(wins[i], 1);
|
||||||
if (c != 0 && c->window == wins[i] && !c->init) {
|
if(c != 0 && c->window == wins[i] && !c->init){
|
||||||
c->x = attr.x;
|
c->x = attr.x;
|
||||||
c->y = attr.y;
|
c->y = attr.y;
|
||||||
c->dx = attr.width;
|
c->dx = attr.width;
|
||||||
|
|
@ -215,7 +219,7 @@ scanwins(ScreenInfo *s)
|
||||||
c->border = attr.border_width;
|
c->border = attr.border_width;
|
||||||
c->screen = s;
|
c->screen = s;
|
||||||
c->parent = s->root;
|
c->parent = s->root;
|
||||||
if (attr.map_state == IsViewable)
|
if(attr.map_state == IsViewable)
|
||||||
manage(c, 1);
|
manage(c, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -228,7 +232,7 @@ gettrans(Client *c)
|
||||||
Window trans;
|
Window trans;
|
||||||
|
|
||||||
trans = None;
|
trans = None;
|
||||||
if (XGetTransientForHint(dpy, c->window, &trans) != 0)
|
if(XGetTransientForHint(dpy, c->window, &trans) != 0)
|
||||||
c->trans = trans;
|
c->trans = trans;
|
||||||
else
|
else
|
||||||
c->trans = None;
|
c->trans = None;
|
||||||
|
|
@ -256,11 +260,11 @@ gravitate(Client *c, int invert)
|
||||||
int gravity, dx, dy, delta;
|
int gravity, dx, dy, delta;
|
||||||
|
|
||||||
gravity = NorthWestGravity;
|
gravity = NorthWestGravity;
|
||||||
if (c->size.flags & PWinGravity)
|
if(c->size.flags & PWinGravity)
|
||||||
gravity = c->size.win_gravity;
|
gravity = c->size.win_gravity;
|
||||||
|
|
||||||
delta = c->border-BORDER;
|
delta = c->border-BORDER;
|
||||||
switch (gravity) {
|
switch (gravity){
|
||||||
case NorthWestGravity:
|
case NorthWestGravity:
|
||||||
dx = 0;
|
dx = 0;
|
||||||
dy = 0;
|
dy = 0;
|
||||||
|
|
@ -304,7 +308,7 @@ gravitate(Client *c, int invert)
|
||||||
}
|
}
|
||||||
dx += BORDER;
|
dx += BORDER;
|
||||||
dy += BORDER;
|
dy += BORDER;
|
||||||
if (invert) {
|
if(invert){
|
||||||
dx = -dx;
|
dx = -dx;
|
||||||
dy = -dy;
|
dy = -dy;
|
||||||
}
|
}
|
||||||
|
|
@ -315,7 +319,7 @@ gravitate(Client *c, int invert)
|
||||||
static void
|
static void
|
||||||
installcmap(ScreenInfo *s, Colormap cmap)
|
installcmap(ScreenInfo *s, Colormap cmap)
|
||||||
{
|
{
|
||||||
if (cmap == None)
|
if(cmap == None)
|
||||||
XInstallColormap(dpy, s->def_cmap);
|
XInstallColormap(dpy, s->def_cmap);
|
||||||
else
|
else
|
||||||
XInstallColormap(dpy, cmap);
|
XInstallColormap(dpy, cmap);
|
||||||
|
|
@ -327,19 +331,19 @@ cmapfocus(Client *c)
|
||||||
int i, found;
|
int i, found;
|
||||||
Client *cc;
|
Client *cc;
|
||||||
|
|
||||||
if (c == 0)
|
if(c == 0)
|
||||||
return;
|
return;
|
||||||
else if (c->ncmapwins != 0) {
|
else if(c->ncmapwins != 0){
|
||||||
found = 0;
|
found = 0;
|
||||||
for (i = c->ncmapwins-1; i >= 0; i--) {
|
for(i = c->ncmapwins-1; i >= 0; i--){
|
||||||
installcmap(c->screen, c->wmcmaps[i]);
|
installcmap(c->screen, c->wmcmaps[i]);
|
||||||
if (c->cmapwins[i] == c->window)
|
if(c->cmapwins[i] == c->window)
|
||||||
found++;
|
found++;
|
||||||
}
|
}
|
||||||
if (!found)
|
if(!found)
|
||||||
installcmap(c->screen, c->cmap);
|
installcmap(c->screen, c->cmap);
|
||||||
}
|
}
|
||||||
else if (c->trans != None && (cc = getclient(c->trans, 0)) != 0 && cc->ncmapwins != 0)
|
else if(c->trans != None && (cc = getclient(c->trans, 0)) != 0 && cc->ncmapwins != 0)
|
||||||
cmapfocus(cc);
|
cmapfocus(cc);
|
||||||
else
|
else
|
||||||
installcmap(c->screen, c->cmap);
|
installcmap(c->screen, c->cmap);
|
||||||
|
|
@ -358,7 +362,7 @@ getcmaps(Client *c)
|
||||||
Window *cw;
|
Window *cw;
|
||||||
XWindowAttributes attr;
|
XWindowAttributes attr;
|
||||||
|
|
||||||
if (!c->init) {
|
if(!c->init){
|
||||||
ignore_badwindow = 1;
|
ignore_badwindow = 1;
|
||||||
XGetWindowAttributes(dpy, c->window, &attr);
|
XGetWindowAttributes(dpy, c->window, &attr);
|
||||||
c->cmap = attr.colormap;
|
c->cmap = attr.colormap;
|
||||||
|
|
@ -367,11 +371,11 @@ getcmaps(Client *c)
|
||||||
}
|
}
|
||||||
|
|
||||||
n = _getprop(c->window, wm_colormaps, XA_WINDOW, 100L, (void*)&cw);
|
n = _getprop(c->window, wm_colormaps, XA_WINDOW, 100L, (void*)&cw);
|
||||||
if (c->ncmapwins != 0) {
|
if(c->ncmapwins != 0){
|
||||||
XFree((char *)c->cmapwins);
|
XFree((char *)c->cmapwins);
|
||||||
free((char *)c->wmcmaps);
|
free((char *)c->wmcmaps);
|
||||||
}
|
}
|
||||||
if (n <= 0) {
|
if(n <= 0){
|
||||||
c->ncmapwins = 0;
|
c->ncmapwins = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -380,8 +384,8 @@ getcmaps(Client *c)
|
||||||
c->cmapwins = cw;
|
c->cmapwins = cw;
|
||||||
|
|
||||||
c->wmcmaps = (Colormap*)malloc(n*sizeof(Colormap));
|
c->wmcmaps = (Colormap*)malloc(n*sizeof(Colormap));
|
||||||
for (i = 0; i < n; i++) {
|
for(i = 0; i < n; i++){
|
||||||
if (cw[i] == c->window)
|
if(cw[i] == c->window)
|
||||||
c->wmcmaps[i] = c->cmap;
|
c->wmcmaps[i] = c->cmap;
|
||||||
else {
|
else {
|
||||||
/* flush any errors (e.g., caused by mozilla tabs) */
|
/* flush any errors (e.g., caused by mozilla tabs) */
|
||||||
|
|
@ -400,17 +404,17 @@ setlabel(Client *c)
|
||||||
{
|
{
|
||||||
char *label, *p;
|
char *label, *p;
|
||||||
|
|
||||||
if (c->iconname != 0)
|
if(c->iconname != 0)
|
||||||
label = c->iconname;
|
label = c->iconname;
|
||||||
else if (c->name != 0)
|
else if(c->name != 0)
|
||||||
label = c->name;
|
label = c->name;
|
||||||
else if (c->instance != 0)
|
else if(c->instance != 0)
|
||||||
label = c->instance;
|
label = c->instance;
|
||||||
else if (c->class != 0)
|
else if(c->class != 0)
|
||||||
label = c->class;
|
label = c->class;
|
||||||
else
|
else
|
||||||
label = "no label";
|
label = "no label";
|
||||||
if ((p = index(label, ':')) != 0)
|
if((p = index(label, ':')) != 0)
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
c->label = label;
|
c->label = label;
|
||||||
}
|
}
|
||||||
|
|
@ -424,7 +428,7 @@ setshape(Client *c)
|
||||||
|
|
||||||
/* don't try to add a border if the window is non-rectangular */
|
/* don't try to add a border if the window is non-rectangular */
|
||||||
rect = XShapeGetRectangles(dpy, c->window, ShapeBounding, &n, &order);
|
rect = XShapeGetRectangles(dpy, c->window, ShapeBounding, &n, &order);
|
||||||
if (n > 1)
|
if(n > 1)
|
||||||
XShapeCombineShape(dpy, c->parent, ShapeBounding, BORDER, BORDER,
|
XShapeCombineShape(dpy, c->parent, ShapeBounding, BORDER, BORDER,
|
||||||
c->window, ShapeBounding, ShapeSet);
|
c->window, ShapeBounding, ShapeSet);
|
||||||
XFree((void*)rect);
|
XFree((void*)rect);
|
||||||
|
|
@ -440,9 +444,9 @@ _getprop(Window w, Atom a, Atom type, long len, unsigned char **p)
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
status = XGetWindowProperty(dpy, w, a, 0L, len, False, type, &real_type, &format, &n, &extra, p);
|
status = XGetWindowProperty(dpy, w, a, 0L, len, False, type, &real_type, &format, &n, &extra, p);
|
||||||
if (status != Success || *p == 0)
|
if(status != Success || *p == 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (n == 0)
|
if(n == 0)
|
||||||
XFree((void*) *p);
|
XFree((void*) *p);
|
||||||
/* could check real_type, format, extra here... */
|
/* could check real_type, format, extra here... */
|
||||||
return n;
|
return n;
|
||||||
|
|
@ -453,7 +457,7 @@ getprop(Window w, Atom a)
|
||||||
{
|
{
|
||||||
unsigned char *p;
|
unsigned char *p;
|
||||||
|
|
||||||
if (_getprop(w, a, XA_STRING, 100L, &p) <= 0)
|
if(_getprop(w, a, XA_STRING, 100L, &p) <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
return (char *)p;
|
return (char *)p;
|
||||||
}
|
}
|
||||||
|
|
@ -463,7 +467,7 @@ get1prop(Window w, Atom a, Atom type)
|
||||||
{
|
{
|
||||||
char **p, *x;
|
char **p, *x;
|
||||||
|
|
||||||
if (_getprop(w, a, type, 1L, (void*)&p) <= 0)
|
if(_getprop(w, a, type, 1L, (void*)&p) <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
x = *p;
|
x = *p;
|
||||||
XFree((void*) p);
|
XFree((void*) p);
|
||||||
|
|
@ -500,7 +504,7 @@ getstate(Window w, int *state)
|
||||||
{
|
{
|
||||||
long *p = 0;
|
long *p = 0;
|
||||||
|
|
||||||
if (_getprop(w, wm_state, wm_state, 2L, (void*)&p) <= 0)
|
if(_getprop(w, wm_state, wm_state, 2L, (void*)&p) <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
*state = (int) *p;
|
*state = (int) *p;
|
||||||
|
|
@ -518,15 +522,15 @@ getproto(Client *c)
|
||||||
|
|
||||||
w = c->window;
|
w = c->window;
|
||||||
c->proto = 0;
|
c->proto = 0;
|
||||||
if ((n = _getprop(w, wm_protocols, XA_ATOM, 20L, (void*)&p)) <= 0)
|
if((n = _getprop(w, wm_protocols, XA_ATOM, 20L, (void*)&p)) <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i = 0; i < n; i++)
|
for(i = 0; i < n; i++)
|
||||||
if (p[i] == wm_delete)
|
if(p[i] == wm_delete)
|
||||||
c->proto |= Pdelete;
|
c->proto |= Pdelete;
|
||||||
else if (p[i] == wm_take_focus)
|
else if(p[i] == wm_take_focus)
|
||||||
c->proto |= Ptakefocus;
|
c->proto |= Ptakefocus;
|
||||||
else if (p[i] == wm_lose_focus)
|
else if(p[i] == wm_lose_focus)
|
||||||
c->proto |= Plosefocus;
|
c->proto |= Plosefocus;
|
||||||
|
|
||||||
XFree((char *) p);
|
XFree((char *) p);
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,13 @@
|
||||||
|
/*
|
||||||
|
* Pop-up menus.
|
||||||
|
*/
|
||||||
|
|
||||||
/* Copyright (c) 1994-1996 David Hogan, see README for licence details */
|
/* Copyright (c) 1994-1996 David Hogan, see README for licence details */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <X11/X.h>
|
#include <X11/X.h>
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|
@ -15,6 +20,7 @@ Client *hiddenc[MAXHIDDEN];
|
||||||
int numhidden;
|
int numhidden;
|
||||||
|
|
||||||
int virt;
|
int virt;
|
||||||
|
int reversehide = 1;
|
||||||
|
|
||||||
Client * currents[NUMVIRTUALS] =
|
Client * currents[NUMVIRTUALS] =
|
||||||
{
|
{
|
||||||
|
|
@ -53,6 +59,15 @@ char *b3items[B3FIXED+MAXHIDDEN+1] =
|
||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
New,
|
||||||
|
Reshape,
|
||||||
|
Move,
|
||||||
|
Delete,
|
||||||
|
Hide
|
||||||
|
};
|
||||||
|
|
||||||
Menu b3menu =
|
Menu b3menu =
|
||||||
{
|
{
|
||||||
b3items,
|
b3items,
|
||||||
|
|
@ -73,14 +88,14 @@ button(XButtonEvent *e)
|
||||||
|
|
||||||
curtime = e->time;
|
curtime = e->time;
|
||||||
s = getscreen(e->root);
|
s = getscreen(e->root);
|
||||||
if (s == 0)
|
if(s == 0)
|
||||||
return;
|
return;
|
||||||
c = getclient(e->window, 0);
|
c = getclient(e->window, 0);
|
||||||
if(c){
|
if(c){
|
||||||
if (debug) fprintf(stderr, "but: e x=%d y=%d c x=%d y=%d dx=%d dy=%d BORDR %d\n",
|
if(debug) fprintf(stderr, "but: e x=%d y=%d c x=%d y=%d dx=%d dy=%d BORDR %d\n",
|
||||||
e->x, e->y, c->x, c->y, c->dx, c->dy, BORDER);
|
e->x, e->y, c->x, c->y, c->dx, c->dy, BORDER);
|
||||||
if(borderorient(c, e->x, e->y) != BorderUnknown){
|
if(borderorient(c, e->x, e->y) != BorderUnknown){
|
||||||
switch (e->button) {
|
switch (e->button){
|
||||||
case Button1:
|
case Button1:
|
||||||
case Button2:
|
case Button2:
|
||||||
reshape(c, e->button, pull, e);
|
reshape(c, e->button, pull, e);
|
||||||
|
|
@ -94,26 +109,26 @@ button(XButtonEvent *e)
|
||||||
}
|
}
|
||||||
e->x += c->x - BORDER;
|
e->x += c->x - BORDER;
|
||||||
e->y += c->y - BORDER;
|
e->y += c->y - BORDER;
|
||||||
} else if (e->window != e->root) {
|
} else if(e->window != e->root){
|
||||||
if (debug) fprintf(stderr, "but no client: e x=%d y=%d\n",
|
if(debug) fprintf(stderr, "but no client: e x=%d y=%d\n",
|
||||||
e->x, e->y);
|
e->x, e->y);
|
||||||
XTranslateCoordinates(dpy, e->window, s->root, e->x, e->y,
|
XTranslateCoordinates(dpy, e->window, s->root, e->x, e->y,
|
||||||
&e->x, &e->y, &dw);
|
&e->x, &e->y, &dw);
|
||||||
}
|
}
|
||||||
switch (e->button) {
|
switch (e->button){
|
||||||
case Button1:
|
case Button1:
|
||||||
if (c) {
|
if(c){
|
||||||
XMapRaised(dpy, c->parent);
|
XMapRaised(dpy, c->parent);
|
||||||
top(c);
|
top(c);
|
||||||
active(c);
|
active(c);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
case Button2:
|
case Button2:
|
||||||
if (c) {
|
if(c){
|
||||||
XMapRaised(dpy, c->parent);
|
XMapRaised(dpy, c->parent);
|
||||||
active(c);
|
active(c);
|
||||||
XAllowEvents (dpy, ReplayPointer, curtime);
|
XAllowEvents (dpy, ReplayPointer, curtime);
|
||||||
} else if ((e->state&(ShiftMask|ControlMask))==(ShiftMask|ControlMask)) {
|
} else if((e->state&(ShiftMask|ControlMask))==(ShiftMask|ControlMask)){
|
||||||
menuhit(e, &egg);
|
menuhit(e, &egg);
|
||||||
} else if(numvirtuals > 1 && (n = menuhit(e, &b2menu)) > -1)
|
} else if(numvirtuals > 1 && (n = menuhit(e, &b2menu)) > -1)
|
||||||
button2(n);
|
button2(n);
|
||||||
|
|
@ -136,24 +151,24 @@ button(XButtonEvent *e)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current && current->screen == s)
|
if(current && current->screen == s)
|
||||||
cmapnofocus(s);
|
cmapnofocus(s);
|
||||||
switch (n = menuhit(e, &b3menu)) {
|
switch (n = menuhit(e, &b3menu)){
|
||||||
case 0: /* New */
|
case New:
|
||||||
spawn(s);
|
spawn(s);
|
||||||
break;
|
break;
|
||||||
case 1: /* Reshape */
|
case Reshape:
|
||||||
reshape(selectwin(1, 0, s), Button3, sweep, 0);
|
reshape(selectwin(1, 0, s), Button3, sweep, 0);
|
||||||
break;
|
break;
|
||||||
case 2: /* Move */
|
case Move:
|
||||||
move(selectwin(0, 0, s), Button3);
|
move(selectwin(0, 0, s), Button3);
|
||||||
break;
|
break;
|
||||||
case 3: /* Delete */
|
case Delete:
|
||||||
shift = 0;
|
shift = 0;
|
||||||
c = selectwin(1, &shift, s);
|
c = selectwin(1, &shift, s);
|
||||||
delete(c, shift);
|
delete(c, shift);
|
||||||
break;
|
break;
|
||||||
case 4: /* Hide */
|
case Hide:
|
||||||
hide(selectwin(1, 0, s));
|
hide(selectwin(1, 0, s));
|
||||||
break;
|
break;
|
||||||
default: /* unhide window */
|
default: /* unhide window */
|
||||||
|
|
@ -162,7 +177,7 @@ button(XButtonEvent *e)
|
||||||
case -1: /* nothing */
|
case -1: /* nothing */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (current && current->screen == s)
|
if(current && current->screen == s)
|
||||||
cmapfocus(current);
|
cmapfocus(current);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -180,15 +195,15 @@ spawn(ScreenInfo *s)
|
||||||
* ugly dance to avoid leaving zombies. Could use SIGCHLD,
|
* ugly dance to avoid leaving zombies. Could use SIGCHLD,
|
||||||
* but it's not very portable.
|
* but it's not very portable.
|
||||||
*/
|
*/
|
||||||
if (fork() == 0) {
|
if(fork() == 0){
|
||||||
if (fork() == 0) {
|
if(fork() == 0){
|
||||||
close(ConnectionNumber(dpy));
|
close(ConnectionNumber(dpy));
|
||||||
if (s->display[0] != '\0')
|
if(s->display[0] != '\0')
|
||||||
putenv(s->display);
|
putenv(s->display);
|
||||||
signal(SIGINT, SIG_DFL);
|
signal(SIGINT, SIG_DFL);
|
||||||
signal(SIGTERM, SIG_DFL);
|
signal(SIGTERM, SIG_DFL);
|
||||||
signal(SIGHUP, SIG_DFL);
|
signal(SIGHUP, SIG_DFL);
|
||||||
if (termprog != NULL) {
|
if(termprog != NULL){
|
||||||
execl(shell, shell, "-c", termprog, 0);
|
execl(shell, shell, "-c", termprog, 0);
|
||||||
fprintf(stderr, "rio: exec %s", shell);
|
fprintf(stderr, "rio: exec %s", shell);
|
||||||
perror(" failed");
|
perror(" failed");
|
||||||
|
|
@ -208,18 +223,18 @@ reshape(Client *c, int but, int (*fn)(Client*, int, XButtonEvent *), XButtonEven
|
||||||
{
|
{
|
||||||
int odx, ody;
|
int odx, ody;
|
||||||
|
|
||||||
if (c == 0)
|
if(c == 0)
|
||||||
return;
|
return;
|
||||||
odx = c->dx;
|
odx = c->dx;
|
||||||
ody = c->dy;
|
ody = c->dy;
|
||||||
if (fn(c, but, e) == 0)
|
if(fn(c, but, e) == 0)
|
||||||
return;
|
return;
|
||||||
active(c);
|
active(c);
|
||||||
top(c);
|
top(c);
|
||||||
XRaiseWindow(dpy, c->parent);
|
XRaiseWindow(dpy, c->parent);
|
||||||
XMoveResizeWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER,
|
XMoveResizeWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER,
|
||||||
c->dx+2*BORDER, c->dy+2*BORDER);
|
c->dx+2*BORDER, c->dy+2*BORDER);
|
||||||
if (c->dx == odx && c->dy == ody)
|
if(c->dx == odx && c->dy == ody)
|
||||||
sendconfig(c);
|
sendconfig(c);
|
||||||
else
|
else
|
||||||
XMoveResizeWindow(dpy, c->window, BORDER, BORDER, c->dx, c->dy);
|
XMoveResizeWindow(dpy, c->window, BORDER, BORDER, c->dx, c->dy);
|
||||||
|
|
@ -228,9 +243,9 @@ reshape(Client *c, int but, int (*fn)(Client*, int, XButtonEvent *), XButtonEven
|
||||||
void
|
void
|
||||||
move(Client *c, int but)
|
move(Client *c, int but)
|
||||||
{
|
{
|
||||||
if (c == 0)
|
if(c == 0)
|
||||||
return;
|
return;
|
||||||
if (drag(c, but) == 0)
|
if(drag(c, but) == 0)
|
||||||
return;
|
return;
|
||||||
active(c);
|
active(c);
|
||||||
top(c);
|
top(c);
|
||||||
|
|
@ -242,9 +257,9 @@ move(Client *c, int but)
|
||||||
void
|
void
|
||||||
delete(Client *c, int shift)
|
delete(Client *c, int shift)
|
||||||
{
|
{
|
||||||
if (c == 0)
|
if(c == 0)
|
||||||
return;
|
return;
|
||||||
if ((c->proto & Pdelete) && !shift)
|
if((c->proto & Pdelete) && !shift)
|
||||||
sendcmessage(c->window, wm_protocols, wm_delete, 0, 0);
|
sendcmessage(c->window, wm_protocols, wm_delete, 0, 0);
|
||||||
else
|
else
|
||||||
XKillClient(dpy, c->window); /* let event clean up */
|
XKillClient(dpy, c->window); /* let event clean up */
|
||||||
|
|
@ -253,19 +268,26 @@ delete(Client *c, int shift)
|
||||||
void
|
void
|
||||||
hide(Client *c)
|
hide(Client *c)
|
||||||
{
|
{
|
||||||
if (c == 0 || numhidden == MAXHIDDEN)
|
if(c == 0 || numhidden == MAXHIDDEN)
|
||||||
return;
|
return;
|
||||||
if (hidden(c)) {
|
if(hidden(c)){
|
||||||
fprintf(stderr, "rio: already hidden: %s\n", c->label);
|
fprintf(stderr, "rio: already hidden: %s\n", c->label);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
XUnmapWindow(dpy, c->parent);
|
XUnmapWindow(dpy, c->parent);
|
||||||
XUnmapWindow(dpy, c->window);
|
XUnmapWindow(dpy, c->window);
|
||||||
setstate(c, IconicState);
|
setstate(c, IconicState);
|
||||||
if (c == current)
|
if(c == current)
|
||||||
nofocus();
|
nofocus();
|
||||||
hiddenc[numhidden] = c;
|
if(reversehide){
|
||||||
b3items[B3FIXED+numhidden] = c->label;
|
memmove(hiddenc+1, hiddenc, numhidden*sizeof hiddenc[0]);
|
||||||
|
memmove(b3items+B3FIXED+1, b3items+B3FIXED, numhidden*sizeof b3items[0]);
|
||||||
|
hiddenc[0] = c;
|
||||||
|
b3items[B3FIXED] = c->label;
|
||||||
|
}else{
|
||||||
|
hiddenc[numhidden] = c;
|
||||||
|
b3items[B3FIXED+numhidden] = c->label;
|
||||||
|
}
|
||||||
numhidden++;
|
numhidden++;
|
||||||
b3items[B3FIXED+numhidden] = 0;
|
b3items[B3FIXED+numhidden] = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -276,19 +298,19 @@ unhide(int n, int map)
|
||||||
Client *c;
|
Client *c;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (n >= numhidden) {
|
if(n >= numhidden){
|
||||||
fprintf(stderr, "rio: unhide: n %d numhidden %d\n", n, numhidden);
|
fprintf(stderr, "rio: unhide: n %d numhidden %d\n", n, numhidden);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
c = hiddenc[n];
|
c = hiddenc[n];
|
||||||
if (!hidden(c)) {
|
if(!hidden(c)){
|
||||||
fprintf(stderr, "rio: unhide: not hidden: %s(0x%x)\n",
|
fprintf(stderr, "rio: unhide: not hidden: %s(0x%x)\n",
|
||||||
c->label, (int)c->window);
|
c->label, (int)c->window);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
c->virt = virt;
|
c->virt = virt;
|
||||||
|
|
||||||
if (map) {
|
if(map){
|
||||||
XMapWindow(dpy, c->window);
|
XMapWindow(dpy, c->window);
|
||||||
XMapRaised(dpy, c->parent);
|
XMapRaised(dpy, c->parent);
|
||||||
setstate(c, NormalState);
|
setstate(c, NormalState);
|
||||||
|
|
@ -297,7 +319,7 @@ unhide(int n, int map)
|
||||||
}
|
}
|
||||||
|
|
||||||
numhidden--;
|
numhidden--;
|
||||||
for (i = n; i < numhidden; i ++) {
|
for(i = n; i < numhidden; i ++){
|
||||||
hiddenc[i] = hiddenc[i+1];
|
hiddenc[i] = hiddenc[i+1];
|
||||||
b3items[B3FIXED+i] = b3items[B3FIXED+i+1];
|
b3items[B3FIXED+i] = b3items[B3FIXED+i+1];
|
||||||
}
|
}
|
||||||
|
|
@ -309,8 +331,8 @@ unhidec(Client *c, int map)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < numhidden; i++)
|
for(i = 0; i < numhidden; i++)
|
||||||
if (c == hiddenc[i]) {
|
if(c == hiddenc[i]){
|
||||||
unhide(i, map);
|
unhide(i, map);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -323,13 +345,13 @@ renamec(Client *c, char *name)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (name == 0)
|
if(name == 0)
|
||||||
name = "???";
|
name = "???";
|
||||||
c->label = name;
|
c->label = name;
|
||||||
if (!hidden(c))
|
if(!hidden(c))
|
||||||
return;
|
return;
|
||||||
for (i = 0; i < numhidden; i++)
|
for(i = 0; i < numhidden; i++)
|
||||||
if (c == hiddenc[i]) {
|
if(c == hiddenc[i]){
|
||||||
b3items[B3FIXED+i] = name;
|
b3items[B3FIXED+i] = name;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -339,37 +361,37 @@ void
|
||||||
button2(int n)
|
button2(int n)
|
||||||
{
|
{
|
||||||
switch_to(n);
|
switch_to(n);
|
||||||
if (current)
|
if(current)
|
||||||
cmapfocus(current);
|
cmapfocus(current);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
switch_to_c(int n, Client *c)
|
switch_to_c(int n, Client *c)
|
||||||
{
|
{
|
||||||
if (c && c->next)
|
if(c && c->next)
|
||||||
switch_to_c(n,c->next);
|
switch_to_c(n,c->next);
|
||||||
|
|
||||||
if (c->parent == DefaultRootWindow(dpy))
|
if(c->parent == DefaultRootWindow(dpy))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (c->virt != virt && c->state == NormalState) {
|
if(c->virt != virt && c->state == NormalState){
|
||||||
XUnmapWindow(dpy, c->parent);
|
XUnmapWindow(dpy, c->parent);
|
||||||
XUnmapWindow(dpy, c->window);
|
XUnmapWindow(dpy, c->window);
|
||||||
setstate(c, IconicState);
|
setstate(c, IconicState);
|
||||||
if (c == current)
|
if(c == current)
|
||||||
nofocus();
|
nofocus();
|
||||||
} else if (c->virt == virt && c->state == IconicState) {
|
} else if(c->virt == virt && c->state == IconicState){
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < numhidden; i++)
|
for(i = 0; i < numhidden; i++)
|
||||||
if (c == hiddenc[i])
|
if(c == hiddenc[i])
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (i == numhidden) {
|
if(i == numhidden){
|
||||||
XMapWindow(dpy, c->window);
|
XMapWindow(dpy, c->window);
|
||||||
XMapWindow(dpy, c->parent);
|
XMapWindow(dpy, c->parent);
|
||||||
setstate(c, NormalState);
|
setstate(c, NormalState);
|
||||||
if (currents[virt] == c)
|
if(currents[virt] == c)
|
||||||
active(c);
|
active(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -378,7 +400,7 @@ switch_to_c(int n, Client *c)
|
||||||
void
|
void
|
||||||
switch_to(int n)
|
switch_to(int n)
|
||||||
{
|
{
|
||||||
if (n == virt)
|
if(n == virt)
|
||||||
return;
|
return;
|
||||||
currents[virt] = current;
|
currents[virt] = current;
|
||||||
virt = n;
|
virt = n;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
<$PLAN9/src/mkhdr
|
<$PLAN9/src/mkhdr
|
||||||
|
<|sh $PLAN9/src/libdraw/mkwsysrules.sh # for X11
|
||||||
|
|
||||||
OFILES=\
|
OFILES=\
|
||||||
client.$O\
|
client.$O\
|
||||||
|
|
@ -7,10 +8,12 @@ OFILES=\
|
||||||
error.$O\
|
error.$O\
|
||||||
event.$O\
|
event.$O\
|
||||||
grab.$O\
|
grab.$O\
|
||||||
|
key.$O\
|
||||||
main.$O\
|
main.$O\
|
||||||
manage.$O\
|
manage.$O\
|
||||||
menu.$O\
|
menu.$O\
|
||||||
|
|
||||||
|
CFLAGS=$CFLAGS -DDEBUG
|
||||||
HFILES=dat.h fns.h
|
HFILES=dat.h fns.h
|
||||||
|
|
||||||
TARG=rio
|
TARG=rio
|
||||||
|
|
@ -18,10 +21,14 @@ TARG=rio
|
||||||
# need to add lib64 when it exists (on x86-64), but
|
# need to add lib64 when it exists (on x86-64), but
|
||||||
# Darwin complains about the nonexistant directory
|
# Darwin complains about the nonexistant directory
|
||||||
L64=`[ -d $X11/lib64 ] && echo 64; echo`
|
L64=`[ -d $X11/lib64 ] && echo 64; echo`
|
||||||
LDFLAGS=-L$X11/lib$L64\ -lXext -lX11
|
LDFLAGS=-L$X11/lib$L64 -lXext -lX11
|
||||||
|
|
||||||
<$PLAN9/src/mkone
|
<$PLAN9/src/mkone
|
||||||
|
|
||||||
CFLAGS=$CFLAGS -DSHAPE -I$X11/include
|
CFLAGS=$CFLAGS -DSHAPE
|
||||||
|
|
||||||
|
$O.xevents: xevents.$O printevent.$O
|
||||||
|
$LD -o $target $prereq $LDFLAGS
|
||||||
|
|
||||||
|
xevents.$O printevent.$O: printevent.h
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue