iButton passthrough when client is not focused - dwm - dynamic window manager Err parazyd.org 70 hgit clone https://git.parazyd.org/dwm URL:https://git.parazyd.org/dwm parazyd.org 70 1Log /git/dwm/log.gph parazyd.org 70 1Files /git/dwm/files.gph parazyd.org 70 1Refs /git/dwm/refs.gph parazyd.org 70 1README /git/dwm/file/README.gph parazyd.org 70 1LICENSE /git/dwm/file/LICENSE.gph parazyd.org 70 i--- Err parazyd.org 70 1commit 022d07605412bc5bd9726f74af9355c562ba4957 /git/dwm/commit/022d07605412bc5bd9726f74af9355c562ba4957.gph parazyd.org 70 1parent 2952b68db88f38be8d34b80c7a7d2c7eb5b2484d /git/dwm/commit/2952b68db88f38be8d34b80c7a7d2c7eb5b2484d.gph parazyd.org 70 hAuthor: Markus Teich URL:mailto:markus.teich@stusta.mhn.de parazyd.org 70 iDate: Sat, 7 Jan 2017 17:21:29 +0100 Err parazyd.org 70 i Err parazyd.org 70 iButton passthrough when client is not focused Err parazyd.org 70 i Err parazyd.org 70 iBefore this change it is not possible to press a button in a client on the first Err parazyd.org 70 iclick if the client is not yet focused. The first click on the button would Err parazyd.org 70 ionly focus the client and a second click on the button is needed to activate it. Err parazyd.org 70 iThis situation can occur when moving the mouse over a client (therefore focusing Err parazyd.org 70 iit) and then moving the focus to another client with keyboard shortcuts. Err parazyd.org 70 i Err parazyd.org 70 iAfter this commit the behavior is fixed and button presses on unfocused clients Err parazyd.org 70 iare passed to the client correctly. Err parazyd.org 70 i Err parazyd.org 70 iDiffstat: Err parazyd.org 70 i M dwm.c | 21 +++++++++++---------- Err parazyd.org 70 i Err parazyd.org 70 i1 file changed, 11 insertions(+), 10 deletions(-) Err parazyd.org 70 i--- Err parazyd.org 70 1diff --git a/dwm.c b/dwm.c /git/dwm/file/dwm.c.gph parazyd.org 70 i@@ -446,6 +446,8 @@ buttonpress(XEvent *e) Err parazyd.org 70 i click = ClkWinTitle; Err parazyd.org 70 i } else if ((c = wintoclient(ev->window))) { Err parazyd.org 70 i focus(c); Err parazyd.org 70 i+ restack(selmon); Err parazyd.org 70 i+ XAllowEvents(dpy, ReplayPointer, CurrentTime); Err parazyd.org 70 i click = ClkClientWin; Err parazyd.org 70 i } Err parazyd.org 70 i for (i = 0; i < LENGTH(buttons); i++) Err parazyd.org 70 i@@ -932,17 +934,16 @@ grabbuttons(Client *c, int focused) Err parazyd.org 70 i unsigned int i, j; Err parazyd.org 70 i unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; Err parazyd.org 70 i XUngrabButton(dpy, AnyButton, AnyModifier, c->win); Err parazyd.org 70 i- if (focused) { Err parazyd.org 70 i- for (i = 0; i < LENGTH(buttons); i++) Err parazyd.org 70 i- if (buttons[i].click == ClkClientWin) Err parazyd.org 70 i- for (j = 0; j < LENGTH(modifiers); j++) Err parazyd.org 70 i- XGrabButton(dpy, buttons[i].button, Err parazyd.org 70 i- buttons[i].mask | modifiers[j], Err parazyd.org 70 i- c->win, False, BUTTONMASK, Err parazyd.org 70 i- GrabModeAsync, GrabModeSync, None, None); Err parazyd.org 70 i- } else Err parazyd.org 70 i+ if (!focused) Err parazyd.org 70 i XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, Err parazyd.org 70 i- BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); Err parazyd.org 70 i+ BUTTONMASK, GrabModeSync, GrabModeSync, None, None); Err parazyd.org 70 i+ for (i = 0; i < LENGTH(buttons); i++) Err parazyd.org 70 i+ if (buttons[i].click == ClkClientWin) Err parazyd.org 70 i+ for (j = 0; j < LENGTH(modifiers); j++) Err parazyd.org 70 i+ XGrabButton(dpy, buttons[i].button, Err parazyd.org 70 i+ buttons[i].mask | modifiers[j], Err parazyd.org 70 i+ c->win, False, BUTTONMASK, Err parazyd.org 70 i+ GrabModeAsync, GrabModeSync, None, None); Err parazyd.org 70 i } Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 .