[hackers] [dwm][PATCH] dwm: add ClkAnywhere click type for location-agnostic mouse bindings

From: jameel-sawafta <jameelhsawafta_AT_gmail.com>
Date: Thu, 22 Jan 2026 18:54:28 +0200

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
_AT_@ -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
_AT_@ -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;
_AT_@ -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);
 }
_AT_@ -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
Received on Thu Jan 22 2026 - 17:54:28 CET

This archive was generated by hypermail 2.3.0 : Thu Jan 22 2026 - 18:12:35 CET