reverting keyboard grab to root window - invoking several dmenu's now works again...
73120414
1 file(s) · +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 | ||