Add a new click type ClkAnywhere that matches any click location (bar,
windows, root window). This allows defining mouse button bindings that
work anywhere on the screen with a single config entry, rather than
duplicating bindings for each click location.
---
 config.def.h | 2 +-
 dwm.c        | 7 ++++---
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/config.def.h b/config.def.h
index 81c3fc0..126e561 100644
--- a/config.def.h
+++ b/config.def.h
@@ -99,7 +99,7 @@ static const Key keys[] = {
 };
 
 /* button definitions */
-/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, 
ClkClientWin, or ClkRootWin */
+/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, 
ClkClientWin, ClkRootWin, or ClkAnywhere */
 static const Button buttons[] = {
        /* click                event mask      button          function        
argument */
        { ClkLtSymbol,          0,              Button1,        setlayout,      
{0} },
diff --git a/dwm.c b/dwm.c
index 53b393e..c260d69 100644
--- a/dwm.c
+++ b/dwm.c
@@ -64,7 +64,7 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
        NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
 enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms 
*/
 enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
-       ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
+       ClkClientWin, ClkRootWin, ClkAnywhere, ClkLast }; /* clicks */
 
 typedef union {
        int i;
@@ -451,7 +451,8 @@ buttonpress(XEvent *e)
                click = ClkClientWin;
        }
        for (i = 0; i < LENGTH(buttons); i++)
-               if (click == buttons[i].click && buttons[i].func && 
buttons[i].button == ev->button
+               if ((click == buttons[i].click || buttons[i].click == 
ClkAnywhere)
+               && buttons[i].func && buttons[i].button == ev->button
                && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
                        buttons[i].func(click == ClkTagBar && buttons[i].arg.i 
== 0 ? &arg : &buttons[i].arg);
 }
@@ -940,7 +941,7 @@ grabbuttons(Client *c, int focused)
                        XGrabButton(dpy, AnyButton, AnyModifier, c->win, False,
                                BUTTONMASK, GrabModeSync, GrabModeSync, None, 
None);
                for (i = 0; i < LENGTH(buttons); i++)
-                       if (buttons[i].click == ClkClientWin)
+                       if (buttons[i].click == ClkClientWin || 
buttons[i].click == ClkAnywhere)
                                for (j = 0; j < LENGTH(modifiers); j++)
                                        XGrabButton(dpy, buttons[i].button,
                                                buttons[i].mask | modifiers[j],
-- 
2.52.0


Reply via email to