[hackers] [dwm][PATCH] Ignore scroll lock along with caps and num lock

From: sulevedant=gmail.com <Vedant>
Date: Wed, 28 Oct 2026 09:15:16 +0000

Add scroll lock mask to the list of masks ignored when registering key
and button presses. This also expands the updatenumlockmask function to
update the modmasks of all locks (caps, num, and scroll).

Updated to be compatible with the current head of the repo.
---
 dwm.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)
diff --git a/dwm.c b/dwm.c
index 421704c..42b24a1 100644
--- a/dwm.c
+++ b/dwm.c
_at_@ -46,10 +46,13 @@
 
 /* macros */
 #define BUTTONMASK              (ButtonPressMask|ButtonReleaseMask)
-#define CLEANMASK(mask)         (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
+#define CLEANMASK(mask)         (mask & ~(capslockmask|numlockmask|scrolllockmask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
 #define INTERSECT(x,y,w,h,m)    (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
                                * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
 #define ISVISIBLE(C)            ((C->tags & C->mon->tagset[C->mon->seltags]))
+#define MODIFIERS		{ 0, capslockmask, numlockmask, scrolllockmask, \
+				capslockmask|numlockmask, numlockmask|scrolllockmask, capslockmask|scrolllockmask, \
+				capslockmask|numlockmask|scrolllockmask }
 #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
 #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
 #define HEIGHT(X)               ((X)->h + 2 * (X)->bw)
_at_@ -219,7 +222,7 @@ static void updatebarpos(Monitor *m);
 static void updatebars(void);
 static void updateclientlist(void);
 static int updategeom(void);
-static void updatenumlockmask(void);
+static void updatelockmasks(void);
 static void updatesizehints(Client *c);
 static void updatestatus(void);
 static void updatetitle(Client *c);
_at_@ -241,7 +244,9 @@ static int sw, sh;           /* X display screen geometry width, height */
 static int bh;               /* bar height */
 static int lrpad;            /* sum of left and right padding for text */
 static int (*xerrorxlib)(Display *, XErrorEvent *);
+static unsigned int capslockmask = 0;
 static unsigned int numlockmask = 0;
+static unsigned int scrolllockmask = 0;
 static void (*handler[LASTEvent]) (XEvent *) = {
 	[ButtonPress] = buttonpress,
 	[ClientMessage] = clientmessage,
_at_@ -937,10 +942,10 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size)
 void
 grabbuttons(Client *c, int focused)
 {
-	updatenumlockmask();
+	updatelockmasks();
 	{
 		unsigned int i, j;
-		unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
+		unsigned int modifiers[] = MODIFIERS;
 		XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
 		if (!focused)
 			XGrabButton(dpy, AnyButton, AnyModifier, c->win, False,
_at_@ -958,10 +963,10 @@ grabbuttons(Client *c, int focused)
 void
 grabkeys(void)
 {
-	updatenumlockmask();
+	updatelockmasks();
 	{
 		unsigned int i, j, k;
-		unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
+		unsigned int modifiers[] = MODIFIERS;
 		int start, end, skip;
 		KeySym *syms;
 
_at_@ -1955,19 +1960,27 @@ updategeom(void)
 }
 
 void
-updatenumlockmask(void)
+updatelockmasks(void)
 {
 	unsigned int i, j;
 	XModifierKeymap *modmap;
 
+	capslockmask = 0;
 	numlockmask = 0;
+	scrolllockmask = 0;
 	if (!(modmap = XGetModifierMapping(dpy)))
 		return;
 	for (i = 0; i < 8; i++)
 		for (j = 0; j < modmap->max_keypermod; j++)
 			if (modmap->modifiermap[i * modmap->max_keypermod + j]
+				== XKeysymToKeycode(dpy, XK_Caps_Lock))
+				capslockmask = (1 << i);
+			else if (modmap->modifiermap[i * modmap->max_keypermod + j]
 				== XKeysymToKeycode(dpy, XK_Num_Lock))
 				numlockmask = (1 << i);
+			else if (modmap->modifiermap[i * modmap->max_keypermod + j]
+				== XKeysymToKeycode(dpy, XK_Scroll_Lock))
+				scrolllockmask = (1 << i);
 	XFreeModifiermap(modmap);
 }
 
-- 
2.55.0
Received on Wed Oct 28 2026 - 10:15:16 CET

This archive was generated by hypermail 2.3.0 : Wed Oct 28 2026 - 10:24:42 CET