mirror of https://github.com/bakkeby/patches
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.7 KiB
Diff
67 lines
2.7 KiB
Diff
From 4541f2ee3016810e9fc9efd58c9de4aac1def76e Mon Sep 17 00:00:00 2001
|
|
From: Bakkeby <bakkeby@gmail.com>
|
|
Date: Tue, 1 Nov 2022 10:31:18 +0100
|
|
Subject: [PATCH] lockmask patch
|
|
|
|
By default in dwm the status of Caps Lock and Num Lock is ignored
|
|
when handling keybindings.
|
|
|
|
To achieve this dwm will, for each button and key binding, subscribe
|
|
to all four combinations of the Caps and Num Lock states, then when
|
|
interpreting the key and button press events the lock states are
|
|
discarded by the CLEANMASK macro.
|
|
|
|
This patch changes this logic so that a user can, if they so desire,
|
|
have keybindings that are only active when the Caps Lock or Num Lock
|
|
are active - while still ignoring the Caps Lock and Num Lock states
|
|
for general keybindings.
|
|
|
|
As an example the following button bindings would allow the user to
|
|
move and resize windows using only the mouse buttons when Caps Lock
|
|
is on (i.e. no need to hold down a modifier key):
|
|
|
|
{ ClkClientWin, LockMask, Button1, movemouse, {0} },
|
|
{ ClkClientWin, LockMask, Button2, togglefloating, {0} },
|
|
{ ClkClientWin, LockMask, Button3, resizemouse, {0} },
|
|
|
|
The modifier for Num Lock is usually Mod2Mask, but check with xmodmap
|
|
to be sure.
|
|
---
|
|
dwm.c | 6 +++---
|
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/dwm.c b/dwm.c
|
|
index e5efb6a..ade5dca 100644
|
|
--- a/dwm.c
|
|
+++ b/dwm.c
|
|
@@ -46,7 +46,7 @@
|
|
|
|
/* macros */
|
|
#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
|
|
-#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
|
|
+#define MATCHMASK(mod,state) ((state & ~((numlockmask|LockMask) ^ ((numlockmask|LockMask) & mod))) == mod)
|
|
#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]))
|
|
@@ -454,7 +454,7 @@ buttonpress(XEvent *e)
|
|
}
|
|
for (i = 0; i < LENGTH(buttons); i++)
|
|
if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
|
|
- && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
|
|
+ && MATCHMASK(buttons[i].mask, ev->state))
|
|
buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
|
|
}
|
|
|
|
@@ -998,7 +998,7 @@ keypress(XEvent *e)
|
|
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
|
|
for (i = 0; i < LENGTH(keys); i++)
|
|
if (keysym == keys[i].keysym
|
|
- && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)
|
|
+ && MATCHMASK(keys[i].mod, ev->state)
|
|
&& keys[i].func)
|
|
keys[i].func(&(keys[i].arg));
|
|
}
|
|
--
|
|
2.19.1
|
|
|