keyboard grab works on the dmenu window now (not on the root window) - thx for Kris for this hint
This commit is contained in:
		
							parent
							
								
									724f72142f
								
							
						
					
					
						commit
						d57c873f10
					
				
							
								
								
									
										41
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								main.c
									
									
									
									
									
								
							| @ -110,7 +110,7 @@ drawmenu(void) { | |||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| grabkeyboard(void) { | grabkeyboard(void) { | ||||||
| 	while(XGrabKeyboard(dpy, root, True, GrabModeAsync, | 	while(XGrabKeyboard(dpy, win, True, GrabModeAsync, | ||||||
| 			 GrabModeAsync, CurrentTime) != GrabSuccess) | 			 GrabModeAsync, CurrentTime) != GrabSuccess) | ||||||
| 		usleep(1000); | 		usleep(1000); | ||||||
| } | } | ||||||
| @ -454,24 +454,6 @@ main(int argc, char *argv[]) { | |||||||
| 		eprint("dmenu: cannot open display\n"); | 		eprint("dmenu: cannot open display\n"); | ||||||
| 	screen = DefaultScreen(dpy); | 	screen = DefaultScreen(dpy); | ||||||
| 	root = RootWindow(dpy, screen); | 	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 */ | 	/* style */ | ||||||
| 	dc.norm[ColBG] = initcolor(normbg); | 	dc.norm[ColBG] = initcolor(normbg); | ||||||
| 	dc.norm[ColFG] = initcolor(normfg); | 	dc.norm[ColFG] = initcolor(normfg); | ||||||
| @ -495,6 +477,25 @@ main(int argc, char *argv[]) { | |||||||
| 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); | 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); | ||||||
| 	if(!dc.font.set) | 	if(!dc.font.set) | ||||||
| 		XSetFont(dpy, dc.gc, dc.font.xfont->fid); | 		XSetFont(dpy, dc.gc, dc.font.xfont->fid); | ||||||
|  | 	drawmenu(); | ||||||
|  | 	XMapRaised(dpy, win); | ||||||
|  | 	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) | 	if(maxname) | ||||||
| 		cmdw = textw(maxname); | 		cmdw = textw(maxname); | ||||||
| 	if(cmdw > mw / 3) | 	if(cmdw > mw / 3) | ||||||
| @ -505,8 +506,6 @@ main(int argc, char *argv[]) { | |||||||
| 		promptw = mw / 5; | 		promptw = mw / 5; | ||||||
| 	text[0] = 0; | 	text[0] = 0; | ||||||
| 	match(text); | 	match(text); | ||||||
| 	XMapRaised(dpy, win); |  | ||||||
| 	drawmenu(); |  | ||||||
| 	XSync(dpy, False); | 	XSync(dpy, False); | ||||||
| 
 | 
 | ||||||
| 	/* main event loop */ | 	/* main event loop */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user