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;
}
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;
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)) {
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++) {
}
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;