reverting keyboard grab to root window - invoking several dmenu's now works again... 73120414
Anselm R. Garbe · 2007-03-07 10:54 1 file(s) · +24 −22
main.c +24 −22
110 110
111 111
static void
112 112
grabkeyboard(void) {
113 -
	while(XGrabKeyboard(dpy, win, True, GrabModeAsync,
113 +
	while(XGrabKeyboard(dpy, root, 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);
457 475
	/* style */
458 476
	dc.norm[ColBG] = initcolor(normbg);
459 477
	dc.norm[ColFG] = initcolor(normfg);
477 495
	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
478 496
	if(!dc.font.set)
479 497
		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
480 -
	drawmenu();
481 -
	XMapRaised(dpy, win);
482 -
	XMaskEvent(dpy, ExposureMask, &ev);
483 -
	drawmenu();
484 -
	if(isatty(STDIN_FILENO)) {
485 -
		maxname = readstdin();
486 -
		grabkeyboard();
487 -
	}
488 -
	else { /* prevent keypress loss */
489 -
		grabkeyboard();
490 -
		maxname = readstdin();
491 -
	}
492 -
	/* init modifier map */
493 -
	modmap = XGetModifierMapping(dpy);
494 -
	for(i = 0; i < 8; i++)
495 -
		for(j = 0; j < modmap->max_keypermod; j++) {
496 -
			if(modmap->modifiermap[i * modmap->max_keypermod + j]
497 -
			== XKeysymToKeycode(dpy, XK_Num_Lock))
498 -
				numlockmask = (1 << i);
499 -
		}
500 -
	XFreeModifiermap(modmap);
501 498
	if(maxname)
502 499
		cmdw = textw(maxname);
503 500
	if(cmdw > mw / 3)
508 505
		promptw = mw / 5;
509 506
	text[0] = 0;
510 507
	match(text);
508 +
	XMapRaised(dpy, win);
511 509
	drawmenu();
512 510
	XSync(dpy, False);
513 511
518 516
			break;
519 517
		case KeyPress:
520 518
			kpress(&ev.xkey);
519 +
			break;
520 +
		case Expose:
521 +
			if(ev.xexpose.count == 0)
522 +
				drawmenu();
521 523
			break;
522 524
		}
523 525