|
11 | 11 | #include "sowm.h" |
12 | 12 |
|
13 | 13 | static client *list = {0}, *ws_list[10] = {0}, *cur; |
14 | | -static int ws = 1, sw, sh, wx, wy, numlock = 0; |
15 | | -static unsigned int ww, wh; |
| 14 | +static int ws = 1, sw, sh, wx, wy; |
| 15 | +static unsigned int ww, wh, clean_mask; |
16 | 16 |
|
17 | 17 | static Display *d; |
18 | 18 | static XButtonEvent mouse; |
@@ -65,10 +65,11 @@ void notify_motion(XEvent *e) { |
65 | 65 |
|
66 | 66 | void key_press(XEvent *e) { |
67 | 67 | KeySym keysym = XkbKeycodeToKeysym(d, e->xkey.keycode, 0, 0); |
| 68 | + unsigned mod = clean_mask & e->xkey.state; |
68 | 69 |
|
69 | 70 | for (unsigned int i=0; i < sizeof(keys)/sizeof(*keys); ++i) |
70 | 71 | if (keys[i].keysym == keysym && |
71 | | - mod_clean(keys[i].mod) == mod_clean(e->xkey.state)) |
| 72 | + keys[i].mod == mod) |
72 | 73 | keys[i].function(keys[i].arg); |
73 | 74 | } |
74 | 75 |
|
@@ -229,17 +230,28 @@ void run(const Arg arg) { |
229 | 230 | execvp((char*)arg.com[0], (char**)arg.com); |
230 | 231 | } |
231 | 232 |
|
232 | | -void input_grab(Window root) { |
| 233 | +// Taken from DWM. Many thanks. https://git.suckless.org/dwm |
| 234 | +static unsigned int numlockmask(void) { |
| 235 | + unsigned int nlm = 0; |
233 | 236 | XModifierKeymap *modmap = XGetModifierMapping(d); |
234 | 237 | KeyCode code = XKeysymToKeycode(d, XK_Num_Lock); |
235 | 238 |
|
236 | 239 | for (unsigned int i = 0; i < 8; i++) |
237 | 240 | for (int m = modmap->max_keypermod, k = 0; k < m; k++) |
238 | 241 | if (modmap->modifiermap[i * m + k] == code) |
239 | | - numlock = 1<<i; |
| 242 | + nlm = 1<<i; |
240 | 243 | XFreeModifiermap(modmap); |
241 | 244 |
|
242 | | - unsigned int modifiers[] = {0, LockMask, numlock, numlock|LockMask}; |
| 245 | + clean_mask = ~(nlm|LockMask) & |
| 246 | + (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask); |
| 247 | + return nlm; |
| 248 | +} |
| 249 | + |
| 250 | +static void input_grab(Window root) { |
| 251 | + unsigned int nlm = numlockmask(); |
| 252 | + unsigned int modifiers[] = {0, LockMask, nlm, nlm|LockMask}; |
| 253 | + KeyCode code; |
| 254 | + |
243 | 255 | for (size_t i = 0; i < sizeof(keys)/sizeof(*keys); i++) |
244 | 256 | if ((code = XKeysymToKeycode(d, keys[i].keysym))) |
245 | 257 | for (size_t j = 0; j < sizeof(modifiers)/sizeof(*modifiers); j++) |
|
0 commit comments