keyboard grab works on the dmenu window now (not on the root window) - thx for Kris for this hint d57c873f
Anselm R. Garbe · 2007-03-02 21:48 1 file(s) · +20 −21
main.c +20 −21
110 110
111 111
static void
112 112
grabkeyboard(void) {
113 -
	while(XGrabKeyboard(dpy, root, True, GrabModeAsync,
113 +
	while(XGrabKeyboard(dpy, win, True, GrabModeAsync,
114 114
			 GrabModeAsync, CurrentTime) != GrabSuccess)
115 115
		usleep(1000);
116 116
}
454 454
		eprint("dmenu: cannot open display\n");
455 455
	screen = DefaultScreen(dpy);
456 456
	root = RootWindow(dpy, screen);
457 -
	if(isatty(STDIN_FILENO)) {
458 -
		maxname = readstdin();
459 -
		grabkeyboard();
460 -
	}
461 -
	else { /* prevent keypress loss */
462 -
		grabkeyboard();
463 -
		maxname = readstdin();
464 -
	}
465 -
	/* init modifier map */
466 -
	modmap = XGetModifierMapping(dpy);
467 -
	for (i = 0; i < 8; i++) {
468 -
		for (j = 0; j < modmap->max_keypermod; j++) {
469 -
			if(modmap->modifiermap[i * modmap->max_keypermod + j]
470 -
			== XKeysymToKeycode(dpy, XK_Num_Lock))
471 -
				numlockmask = (1 << i);
472 -
		}
473 -
	}
474 -
	XFreeModifiermap(modmap);
475 457
	/* style */
476 458
	dc.norm[ColBG] = initcolor(normbg);
477 459
	dc.norm[ColFG] = initcolor(normfg);
495 477
	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
496 478
	if(!dc.font.set)
497 479
		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
480 +
	drawmenu();
481 +
	XMapRaised(dpy, win);
482 +
	if(isatty(STDIN_FILENO)) {
483 +
		maxname = readstdin();
484 +
		grabkeyboard();
485 +
	}
486 +
	else { /* prevent keypress loss */
487 +
		grabkeyboard();
488 +
		maxname = readstdin();
489 +
	}
490 +
	/* init modifier map */
491 +
	modmap = XGetModifierMapping(dpy);
492 +
	for(i = 0; i < 8; i++)
493 +
		for(j = 0; j < modmap->max_keypermod; j++) {
494 +
			if(modmap->modifiermap[i * modmap->max_keypermod + j]
495 +
			== XKeysymToKeycode(dpy, XK_Num_Lock))
496 +
				numlockmask = (1 << i);
497 +
		}
498 +
	XFreeModifiermap(modmap);
498 499
	if(maxname)
499 500
		cmdw = textw(maxname);
500 501
	if(cmdw > mw / 3)
505 506
		promptw = mw / 5;
506 507
	text[0] = 0;
507 508
	match(text);
508 -
	XMapRaised(dpy, win);
509 -
	drawmenu();
510 509
	XSync(dpy, False);
511 510
512 511
	/* main event loop */