formatting changes; attempt at keyboard-based window switching

This commit is contained in:
rsc 2005-07-13 03:54:35 +00:00
parent 7ce3f20d73
commit ac33a34a29
11 changed files with 494 additions and 411 deletions

View file

@ -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);
}

View file

@ -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;
} }

View file

@ -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);

View file

@ -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);
} }

View file

@ -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]);

View file

@ -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();

View file

@ -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

View file

@ -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);
} }

View file

@ -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);

View file

@ -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;

View file

@ -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