diff -r 241dafc690b9 dwm.c --- a/dwm.c Thu Sep 04 02:33:11 2008 -0700 +++ b/dwm.c Tue Sep 09 20:28:54 2008 -0700 @@ -157,7 +157,7 @@ static long getstate(Window w); static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); static void grabbuttons(Client *c, Bool focused); -static void grabkeys(void); +static void grabkeys(Window w); static void initfont(const char *fontstr); static Bool isoccupied(unsigned int t); static Bool isprotodel(Client *c); @@ -234,7 +234,7 @@ static Display *dpy; static DC dc = {0}; static Layout *lt[] = { NULL, NULL }; -static Window root, barwin; +static Window root, barwin, bgwin; /* configuration, allows nested code to access above variables */ #include "config.h" @@ -767,7 +767,7 @@ } void -grabkeys(void) { +grabkeys(Window w) { unsigned int i, j; KeyCode code; XModifierKeymap *modmap; @@ -781,16 +781,16 @@ } XFreeModifiermap(modmap); - XUngrabKey(dpy, AnyKey, AnyModifier, root); + XUngrabKey(dpy, AnyKey, AnyModifier, w); for(i = 0; i < LENGTH(keys); i++) { code = XKeysymToKeycode(dpy, keys[i].keysym); - XGrabKey(dpy, code, keys[i].mod, root, True, + XGrabKey(dpy, code, keys[i].mod, w, True, GrabModeAsync, GrabModeAsync); - XGrabKey(dpy, code, keys[i].mod|LockMask, root, True, + XGrabKey(dpy, code, keys[i].mod|LockMask, w, True, GrabModeAsync, GrabModeAsync); - XGrabKey(dpy, code, keys[i].mod|numlockmask, root, True, + XGrabKey(dpy, code, keys[i].mod|numlockmask, w, True, GrabModeAsync, GrabModeAsync); - XGrabKey(dpy, code, keys[i].mod|numlockmask|LockMask, root, True, + XGrabKey(dpy, code, keys[i].mod|numlockmask|LockMask, w, True, GrabModeAsync, GrabModeAsync); } } @@ -967,15 +967,17 @@ XMapWindow(dpy, c->win); setclientstate(c, NormalState); arrange(); + grabkeys(c->win); } void mappingnotify(XEvent *e) { XMappingEvent *ev = &e->xmapping; + /* I have no idea what this is for */ XRefreshKeyboardMapping(ev); if(ev->request == MappingKeyboard) - grabkeys(); + abort(); } void @@ -1449,9 +1451,17 @@ XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); XSelectInput(dpy, root, wa.event_mask); + /* create bg window to capture keypresses */ + bgwin = XCreateWindow(dpy, root, wx, wy, ww, wh, 0, DefaultDepth(dpy, screen), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + XDefineCursor(dpy, bgwin, cursor[CurNormal]); + XMapWindow(dpy, bgwin); + XLowerWindow(dpy, bgwin); /* grab keys */ - grabkeys(); + grabkeys(barwin); + grabkeys(bgwin); } void