if isatty() first read from stdin and then grab the keyboard, otherwise first grab the keyboard and then read from stdin
This commit is contained in:
		
							
								
								
									
										27
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								main.c
									
									
									
									
									
								
							@@ -108,6 +108,13 @@ drawmenu(void) {
 | 
			
		||||
	XFlush(dpy);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
grabkeyboard(void) {
 | 
			
		||||
	while(XGrabKeyboard(dpy, root, True, GrabModeAsync,
 | 
			
		||||
			 GrabModeAsync, CurrentTime) != GrabSuccess)
 | 
			
		||||
		usleep(1000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned long
 | 
			
		||||
initcolor(const char *colstr) {
 | 
			
		||||
	Colormap cmap = DefaultColormap(dpy, screen);
 | 
			
		||||
@@ -418,12 +425,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 +448,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 +458,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++) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user