Added tag 2.7 for changeset fbd9e9d63f20
[dmenu.git] / main.c
diff --git a/main.c b/main.c
index 3ac1c91..beb8411 100644 (file)
--- a/main.c
+++ b/main.c
@@ -108,8 +108,15 @@ drawmenu(void) {
        XFlush(dpy);
 }
 
+static void
+grabkeyboard(void) {
+       while(XGrabKeyboard(dpy, win, True, GrabModeAsync,
+                        GrabModeAsync, CurrentTime) != GrabSuccess)
+               usleep(1000);
+}
+
 static unsigned long
-getcolor(const char *colstr) {
+initcolor(const char *colstr) {
        Colormap cmap = DefaultColormap(dpy, screen);
        XColor color;
 
@@ -196,7 +203,7 @@ match(char *pattern) {
 static void
 kpress(XKeyEvent * e) {
        char buf[32];
-       int i, num, prev_nitem;
+       int i, num;
        unsigned int len;
        KeySym ksym;
 
@@ -282,12 +289,8 @@ kpress(XKeyEvent * e) {
                }
                break;
        case XK_BackSpace:
-               if((i = len)) {
-                       prev_nitem = nitem;
-                       do {
-                               text[--i] = 0;
-                               match(text);
-                       } while(i && nitem && prev_nitem == nitem);
+               if(len) {
+                       text[--len] = 0;
                        match(text);
                }
                break;
@@ -418,10 +421,6 @@ main(int argc, char *argv[]) {
        XModifierKeymap *modmap;
        XSetWindowAttributes wa;
 
-       if(isatty(STDIN_FILENO)) {
-               fputs("error: dmenu can't run in an interactive shell\n", stdout);
-               usage();
-       }
        /* command line args */
        for(i = 1; i < argc; i++)
                if(!strncmp(argv[i], "-b", 3)) {
@@ -455,25 +454,11 @@ main(int argc, char *argv[]) {
                eprint("dmenu: cannot open display\n");
        screen = DefaultScreen(dpy);
        root = RootWindow(dpy, screen);
-       while(XGrabKeyboard(dpy, root, True, GrabModeAsync,
-                        GrabModeAsync, CurrentTime) != GrabSuccess)
-               usleep(1000);
-       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] = getcolor(normbg);
-       dc.norm[ColFG] = getcolor(normfg);
-       dc.sel[ColBG] = getcolor(selbg);
-       dc.sel[ColFG] = getcolor(selfg);
+       dc.norm[ColBG] = initcolor(normbg);
+       dc.norm[ColFG] = initcolor(normfg);
+       dc.sel[ColBG] = initcolor(selbg);
+       dc.sel[ColFG] = initcolor(selfg);
        initfont(font);
        /* menu window */
        wa.override_redirect = 1;
@@ -490,6 +475,27 @@ main(int argc, char *argv[]) {
        dc.drawable = XCreatePixmap(dpy, root, mw, mh, DefaultDepth(dpy, screen));
        dc.gc = XCreateGC(dpy, root, 0, 0);
        XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
+       if(!dc.font.set)
+               XSetFont(dpy, dc.gc, dc.font.xfont->fid);
+       drawmenu();
+       XMapRaised(dpy, win);
+       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)
@@ -500,8 +506,6 @@ main(int argc, char *argv[]) {
                promptw = mw / 5;
        text[0] = 0;
        match(text);
-       XMapRaised(dpy, win);
-       drawmenu();
        XSync(dpy, False);
 
        /* main event loop */