]> git.armaanb.net Git - dwm.git/commitdiff
Button passthrough when client is not focused
authorMarkus Teich <markus.teich@stusta.mhn.de>
Sat, 7 Jan 2017 16:21:29 +0000 (17:21 +0100)
committerAnselm R Garbe <anselm@garbe.us>
Tue, 28 Mar 2017 18:23:34 +0000 (20:23 +0200)
Before this change it is not possible to press a button in a client on the first
click if the client is not yet focused. The first click on the button would
only focus the client and a second click on the button is needed to activate it.
This situation can occur when moving the mouse over a client (therefore focusing
it) and then moving the focus to another client with keyboard shortcuts.

After this commit the behavior is fixed and button presses on unfocused clients
are passed to the client correctly.

dwm.c

diff --git a/dwm.c b/dwm.c
index 3f80b632eca1fbc8b700d9334dde12b997f7dfad..9c01d1a154e05a0f0d1bd6e486c0fd6d8c9987d5 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -446,6 +446,8 @@ buttonpress(XEvent *e)
                        click = ClkWinTitle;
        } else if ((c = wintoclient(ev->window))) {
                focus(c);
+               restack(selmon);
+               XAllowEvents(dpy, ReplayPointer, CurrentTime);
                click = ClkClientWin;
        }
        for (i = 0; i < LENGTH(buttons); i++)
@@ -932,17 +934,16 @@ grabbuttons(Client *c, int focused)
                unsigned int i, j;
                unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
                XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
-               if (focused) {
-                       for (i = 0; i < LENGTH(buttons); i++)
-                               if (buttons[i].click == ClkClientWin)
-                                       for (j = 0; j < LENGTH(modifiers); j++)
-                                               XGrabButton(dpy, buttons[i].button,
-                                                           buttons[i].mask | modifiers[j],
-                                                           c->win, False, BUTTONMASK,
-                                                           GrabModeAsync, GrabModeSync, None, None);
-               } else
+               if (!focused)
                        XGrabButton(dpy, AnyButton, AnyModifier, c->win, False,
-                                   BUTTONMASK, GrabModeAsync, GrabModeSync, None, None);
+                                   BUTTONMASK, GrabModeSync, GrabModeSync, None, None);
+               for (i = 0; i < LENGTH(buttons); i++)
+                       if (buttons[i].click == ClkClientWin)
+                               for (j = 0; j < LENGTH(modifiers); j++)
+                                       XGrabButton(dpy, buttons[i].button,
+                                                   buttons[i].mask | modifiers[j],
+                                                   c->win, False, BUTTONMASK,
+                                                   GrabModeAsync, GrabModeSync, None, None);
        }
 }