---
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