dmenu

my fork of dmenu
Index Commits Files Refs README LICENSE
commit 73120414e2e4a3a8031b243fb0d893506d4a0dc1
parent 9911455f5b7787c999a570faf33cf6ad0bec056c
Author: Anselm R. Garbe <arg@suckless.org>
Date:   Wed,  7 Mar 2007 10:54:21 +0100

reverting keyboard grab to root window - invoking several dmenu's now works again...
Diffstat:
Mmain.c | 46++++++++++++++++++++++++----------------------
1 file changed, 24 insertions(+), 22 deletions(-)
diff --git a/main.c b/main.c
@@ -110,7 +110,7 @@ drawmenu(void) {
 
 static void
 grabkeyboard(void) {
-    while(XGrabKeyboard(dpy, win, True, GrabModeAsync,
+    while(XGrabKeyboard(dpy, root, True, GrabModeAsync,
              GrabModeAsync, CurrentTime) != GrabSuccess)
         usleep(1000);
 }
@@ -454,6 +454,24 @@ main(int argc, char *argv[]) {
         eprint("dmenu: cannot open display\n");
     screen = DefaultScreen(dpy);
     root = RootWindow(dpy, screen);
+    if(isatty(STDIN_FILENO)) {
+        maxname = readstdin();
+        grabkeyboard();
+    }
+    else { /* prevent keypress loss */
+        grabkeyboard();
+        maxname = readstdin();
+    }
+    /* init modifier map */
+    modmap = XGetModifierMapping(dpy);
+    for (i = 0; i < 8; i++) {
+        for (j = 0; j < modmap->max_keypermod; j++) {
+            if(modmap->modifiermap[i * modmap->max_keypermod + j]
+            == XKeysymToKeycode(dpy, XK_Num_Lock))
+                numlockmask = (1 << i);
+        }
+    }
+    XFreeModifiermap(modmap);
     /* style */
     dc.norm[ColBG] = initcolor(normbg);
     dc.norm[ColFG] = initcolor(normfg);
@@ -477,27 +495,6 @@ main(int argc, char *argv[]) {
     XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
     if(!dc.font.set)
         XSetFont(dpy, dc.gc, dc.font.xfont->fid);
-    drawmenu();
-    XMapRaised(dpy, win);
-    XMaskEvent(dpy, ExposureMask, &ev);
-    drawmenu();
-    if(isatty(STDIN_FILENO)) {
-        maxname = readstdin();
-        grabkeyboard();
-    }
-    else { /* prevent keypress loss */
-        grabkeyboard();
-        maxname = readstdin();
-    }
-    /* init modifier map */
-    modmap = XGetModifierMapping(dpy);
-    for(i = 0; i < 8; i++)
-        for(j = 0; j < modmap->max_keypermod; j++) {
-            if(modmap->modifiermap[i * modmap->max_keypermod + j]
-            == XKeysymToKeycode(dpy, XK_Num_Lock))
-                numlockmask = (1 << i);
-        }
-    XFreeModifiermap(modmap);
     if(maxname)
         cmdw = textw(maxname);
     if(cmdw > mw / 3)
@@ -508,6 +505,7 @@ main(int argc, char *argv[]) {
         promptw = mw / 5;
     text[0] = 0;
     match(text);
+    XMapRaised(dpy, win);
     drawmenu();
     XSync(dpy, False);
 
@@ -519,6 +517,10 @@ main(int argc, char *argv[]) {
         case KeyPress:
             kpress(&ev.xkey);
             break;
+        case Expose:
+            if(ev.xexpose.count == 0)
+                drawmenu();
+            break;
         }
 
     /* cleanup */