diff options
| -rw-r--r-- | main.c | 46 | 
1 files changed, 24 insertions, 22 deletions
@@ -110,7 +110,7 @@ drawmenu(void) {  static void  grabkeyboard(void) { -	while(XGrabKeyboard(dpy, win, True, GrabModeAsync, +	while(XGrabKeyboard(dpy, root, True, GrabModeAsync,  			 GrabModeAsync, CurrentTime) != GrabSuccess)  		usleep(1000);  } @@ -454,6 +454,24 @@ main(int argc, char *argv[]) {  		eprint("dmenu: cannot open display\n");  	screen = DefaultScreen(dpy);  	root = RootWindow(dpy, screen); +	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++) { +		for (j = 0; j < modmap->max_keypermod; j++) { +			if(modmap->modifiermap[i * modmap->max_keypermod + j] +			== XKeysymToKeycode(dpy, XK_Num_Lock)) +				numlockmask = (1 << i); +		} +	} +	XFreeModifiermap(modmap);  	/* style */  	dc.norm[ColBG] = initcolor(normbg);  	dc.norm[ColFG] = initcolor(normfg); @@ -477,27 +495,6 @@ main(int argc, char *argv[]) {  	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);  	if(!dc.font.set)  		XSetFont(dpy, dc.gc, dc.font.xfont->fid); -	drawmenu(); -	XMapRaised(dpy, win); -	XMaskEvent(dpy, ExposureMask, &ev); -	drawmenu(); -	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++) -		for(j = 0; j < modmap->max_keypermod; j++) { -			if(modmap->modifiermap[i * modmap->max_keypermod + j] -			== XKeysymToKeycode(dpy, XK_Num_Lock)) -				numlockmask = (1 << i); -		} -	XFreeModifiermap(modmap);  	if(maxname)  		cmdw = textw(maxname);  	if(cmdw > mw / 3) @@ -508,6 +505,7 @@ main(int argc, char *argv[]) {  		promptw = mw / 5;  	text[0] = 0;  	match(text); +	XMapRaised(dpy, win);  	drawmenu();  	XSync(dpy, False); @@ -519,6 +517,10 @@ main(int argc, char *argv[]) {  		case KeyPress:  			kpress(&ev.xkey);  			break; +		case Expose: +			if(ev.xexpose.count == 0) +				drawmenu(); +			break;  		}  	/* cleanup */  | 
