diff options
author | Anselm R. Garbe <arg@suckless.org> | 2007-02-26 11:44:41 +0100 |
---|---|---|
committer | Anselm R. Garbe <arg@suckless.org> | 2007-02-26 11:44:41 +0100 |
commit | 8a066fabd9796ca80f5a359c3c6cf57c947b1b95 (patch) | |
tree | 150526e2113cce51439d0ac5072aee8d83ecec49 | |
parent | 6c0e05eb0d297a0d26080bea3b6040ab14ad65ae (diff) |
if isatty() first read from stdin and then grab the keyboard, otherwise first grab the keyboard and then read from stdin
-rw-r--r-- | main.c | 27 |
1 files changed, 17 insertions, 10 deletions
@@ -108,6 +108,13 @@ drawmenu(void) { | |||
108 | XFlush(dpy); | 108 | XFlush(dpy); |
109 | } | 109 | } |
110 | 110 | ||
111 | static void | ||
112 | grabkeyboard(void) { | ||
113 | while(XGrabKeyboard(dpy, root, True, GrabModeAsync, | ||
114 | GrabModeAsync, CurrentTime) != GrabSuccess) | ||
115 | usleep(1000); | ||
116 | } | ||
117 | |||
111 | static unsigned long | 118 | static unsigned long |
112 | initcolor(const char *colstr) { | 119 | initcolor(const char *colstr) { |
113 | Colormap cmap = DefaultColormap(dpy, screen); | 120 | Colormap cmap = DefaultColormap(dpy, screen); |
@@ -418,12 +425,6 @@ main(int argc, char *argv[]) { | |||
418 | XModifierKeymap *modmap; | 425 | XModifierKeymap *modmap; |
419 | XSetWindowAttributes wa; | 426 | XSetWindowAttributes wa; |
420 | 427 | ||
421 | if(argc == 2 && !strncmp("-v", argv[1], 3)) | ||
422 | eprint("dmenu-"VERSION", (C)opyright MMVI-MMVII Anselm R. Garbe\n"); | ||
423 | else if(isatty(STDIN_FILENO)) { | ||
424 | fputs("error: dmenu can't run in an interactive shell\n", stdout); | ||
425 | usage(); | ||
426 | } | ||
427 | /* command line args */ | 428 | /* command line args */ |
428 | for(i = 1; i < argc; i++) | 429 | for(i = 1; i < argc; i++) |
429 | if(!strncmp(argv[i], "-b", 3)) { | 430 | if(!strncmp(argv[i], "-b", 3)) { |
@@ -447,6 +448,8 @@ main(int argc, char *argv[]) { | |||
447 | else if(!strncmp(argv[i], "-sf", 4)) { | 448 | else if(!strncmp(argv[i], "-sf", 4)) { |
448 | if(++i < argc) selfg = argv[i]; | 449 | if(++i < argc) selfg = argv[i]; |
449 | } | 450 | } |
451 | else if(!strncmp(argv[i], "-v", 3)) | ||
452 | eprint("dmenu-"VERSION", (C)opyright MMVI-MMVII Anselm R. Garbe\n"); | ||
450 | else | 453 | else |
451 | usage(); | 454 | usage(); |
452 | setlocale(LC_CTYPE, ""); | 455 | setlocale(LC_CTYPE, ""); |
@@ -455,10 +458,14 @@ main(int argc, char *argv[]) { | |||
455 | eprint("dmenu: cannot open display\n"); | 458 | eprint("dmenu: cannot open display\n"); |
456 | screen = DefaultScreen(dpy); | 459 | screen = DefaultScreen(dpy); |
457 | root = RootWindow(dpy, screen); | 460 | root = RootWindow(dpy, screen); |
458 | while(XGrabKeyboard(dpy, root, True, GrabModeAsync, | 461 | if(isatty(STDIN_FILENO)) { |
459 | GrabModeAsync, CurrentTime) != GrabSuccess) | 462 | maxname = readstdin(); |
460 | usleep(1000); | 463 | grabkeyboard(); |
461 | maxname = readstdin(); | 464 | } |
465 | else { /* prevent keypress loss */ | ||
466 | grabkeyboard(); | ||
467 | maxname = readstdin(); | ||
468 | } | ||
462 | /* init modifier map */ | 469 | /* init modifier map */ |
463 | modmap = XGetModifierMapping(dpy); | 470 | modmap = XGetModifierMapping(dpy); |
464 | for (i = 0; i < 8; i++) { | 471 | for (i = 0; i < 8; i++) { |