Hi,
Changeset 1320:65c37b4be9cb introduces a bug in grabkeys() that causes
MODKEY presses to be ignored if numlock is enabled on my system.
The problem is that between initializing modifiers[] with numlockmask
and using it later, numlockmask is changed without updating modifiers[].
Maybe extract a function initmodmap(), to be called before grabkeys(),
from the modmap initializiation block? Right now grabbuttons(), which
uses numlockmask as well, subtly depends on grabkeys() having been
called beforehand; this might make it a little more explicit what's
going on.
I've attached a patch that works for me, hopefully someone who knows
more about that stuff can look over it.
Regards,
Peter
diff -r c4ecef7983b8 dwm.c
--- a/dwm.c Mon Aug 18 19:28:34 2008 +0100
+++ b/dwm.c Tue Aug 19 15:36:05 2008 +0200
@@ -158,6 +158,7 @@
static void grabbuttons(Client *c, Bool focused);
static void grabkeys(void);
static void initfont(const char *fontstr);
+static void initmodmap(void);
static Bool isprotodel(Client *c);
static void keypress(XEvent *e);
static void killclient(const Arg *arg);
@@ -753,16 +754,6 @@
unsigned int i, j;
unsigned int modifiers[] = { 0, LockMask, numlockmask,
numlockmask|LockMask };
KeyCode code;
- XModifierKeymap *modmap;
-
- /* init modifier map */
- modmap = XGetModifierMapping(dpy);
- 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_Num_Lock))
- numlockmask = (1 << i);
- }
- XFreeModifiermap(modmap);
XUngrabKey(dpy, AnyKey, AnyModifier, root);
for(i = 0; i < LENGTH(keys); i++) {
@@ -811,6 +802,19 @@
dc.font.descent = dc.font.xfont->descent;
}
dc.font.height = dc.font.ascent + dc.font.descent;
+}
+
+void
+initmodmap(void) {
+ unsigned int i, j;
+ XModifierKeymap *modmap;
+
+ modmap = XGetModifierMapping(dpy);
+ 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_Num_Lock))
+ numlockmask = (1 << i);
+ XFreeModifiermap(modmap);
}
Bool
@@ -925,8 +929,10 @@
XMappingEvent *ev = &e->xmapping;
XRefreshKeyboardMapping(ev);
- if(ev->request == MappingKeyboard)
+ if(ev->request == MappingKeyboard) {
+ initmodmap();
grabkeys();
+ }
}
void
@@ -1373,8 +1379,7 @@
XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa);
XSelectInput(dpy, root, wa.event_mask);
-
- /* grab keys */
+ initmodmap();
grabkeys();
}