X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=main.c;h=9fab3283a6c49058a7bd96076a20d901fd115df6;hb=85a151c6a43407b0fbd74562f46744e0e825c691;hp=cd0e2b5df0472c654b2282b16d2a75a3cf08f4b4;hpb=6b5b580affe4f1f5315afd375c86a87d44799778;p=dmenu.git diff --git a/main.c b/main.c index cd0e2b5..9fab328 100644 --- a/main.c +++ b/main.c @@ -108,6 +108,19 @@ drawmenu(void) { XFlush(dpy); } +static Bool +grabkeyboard(void) { + unsigned int len; + + for(len = 1000; len; len--) { + if(XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime) + == GrabSuccess) + break; + usleep(1000); + } + return len > 0; +} + static unsigned long initcolor(const char *colstr) { Colormap cmap = DefaultColormap(dpy, screen); @@ -196,13 +209,20 @@ match(char *pattern) { static void kpress(XKeyEvent * e) { char buf[32]; - int i, num, prev_nitem; + int i, num; unsigned int len; KeySym ksym; len = strlen(text); buf[0] = 0; num = XLookupString(e, buf, sizeof buf, &ksym, 0); + if(IsKeypadKey(ksym)) { + if(ksym == XK_KP_Enter) { + ksym = XK_Return; + } else if(ksym >= XK_KP_0 && ksym <= XK_KP_9) { + ksym = (ksym - XK_KP_0) + XK_0; + } + } if(IsFunctionKey(ksym) || IsKeypadKey(ksym) || IsMiscFunctionKey(ksym) || IsPFKey(ksym) || IsPrivateKeypadKey(ksym)) @@ -282,12 +302,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,12 +434,6 @@ main(int argc, char *argv[]) { XModifierKeymap *modmap; XSetWindowAttributes wa; - if(argc == 2 && !strncmp("-v", argv[1], 3)) - eprint("dmenu-"VERSION", (C)opyright MMVI-MMVII Anselm R. Garbe\n"); - else 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)) { @@ -447,6 +457,8 @@ main(int argc, char *argv[]) { else if(!strncmp(argv[i], "-sf", 4)) { if(++i < argc) selfg = argv[i]; } + else if(!strncmp(argv[i], "-v", 3)) + eprint("dmenu-"VERSION", (C)opyright MMVI-MMVII Anselm R. Garbe\n"); else usage(); setlocale(LC_CTYPE, ""); @@ -455,10 +467,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(); + running = grabkeyboard(); + } + else { /* prevent keypress loss */ + running = grabkeyboard(); + maxname = readstdin(); + } /* init modifier map */ modmap = XGetModifierMapping(dpy); for (i = 0; i < 8; i++) { @@ -490,6 +506,8 @@ 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); if(maxname) cmdw = textw(maxname); if(cmdw > mw / 3)