X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=main.c;h=b733feb5fc76a6c20578feab338b1fc4409a41e2;hb=03c2b05bb2265e0ef7ba33b7f6df36bd6e0ce54d;hp=8b24bb07bcfa146e88489144801d8622ea1a9d5e;hpb=a1913a6af7c9cd6de18e15e989050690fdaa6600;p=dmenu.git diff --git a/main.c b/main.c index 8b24bb0..b733feb 100644 --- a/main.c +++ b/main.c @@ -108,8 +108,15 @@ drawmenu(void) { XFlush(dpy); } +static void +grabkeyboard(void) { + while(XGrabKeyboard(dpy, root, 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; @@ -119,7 +126,7 @@ getcolor(const char *colstr) { } static void -setfont(const char *fontstr) { +initfont(const char *fontstr) { char *def, **missing; int i, n; @@ -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,10 +454,14 @@ 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(); + 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++) { @@ -470,11 +473,11 @@ main(int argc, char *argv[]) { } XFreeModifiermap(modmap); /* style */ - dc.norm[ColBG] = getcolor(normbg); - dc.norm[ColFG] = getcolor(normfg); - dc.sel[ColBG] = getcolor(selbg); - dc.sel[ColFG] = getcolor(selfg); - setfont(font); + 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; wa.background_pixmap = ParentRelative;