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
