Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit f86fa65

Browse files
committed
sowm: separate numlockmask function
1 parent c827338 commit f86fa65

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

sowm.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
#include "sowm.h"
1212

1313
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;
1616

1717
static Display *d;
1818
static XButtonEvent mouse;
@@ -65,10 +65,11 @@ void notify_motion(XEvent *e) {
6565

6666
void key_press(XEvent *e) {
6767
KeySym keysym = XkbKeycodeToKeysym(d, e->xkey.keycode, 0, 0);
68+
unsigned mod = clean_mask & e->xkey.state;
6869

6970
for (unsigned int i=0; i < sizeof(keys)/sizeof(*keys); ++i)
7071
if (keys[i].keysym == keysym &&
71-
mod_clean(keys[i].mod) == mod_clean(e->xkey.state))
72+
keys[i].mod == mod)
7273
keys[i].function(keys[i].arg);
7374
}
7475

@@ -229,17 +230,28 @@ void run(const Arg arg) {
229230
execvp((char*)arg.com[0], (char**)arg.com);
230231
}
231232

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;
233236
XModifierKeymap *modmap = XGetModifierMapping(d);
234237
KeyCode code = XKeysymToKeycode(d, XK_Num_Lock);
235238

236239
for (unsigned int i = 0; i < 8; i++)
237240
for (int m = modmap->max_keypermod, k = 0; k < m; k++)
238241
if (modmap->modifiermap[i * m + k] == code)
239-
numlock = 1<<i;
242+
nlm = 1<<i;
240243
XFreeModifiermap(modmap);
241244

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+
243255
for (size_t i = 0; i < sizeof(keys)/sizeof(*keys); i++)
244256
if ((code = XKeysymToKeycode(d, keys[i].keysym)))
245257
for (size_t j = 0; j < sizeof(modifiers)/sizeof(*modifiers); j++)

sowm.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@
99
XGetGeometry(d, W, &(Window){0}, gx, gy, gw, gh, \
1010
&(unsigned int){0}, &(unsigned int){0})
1111

12-
// Taken from DWM. Many thanks. https://git.suckless.org/dwm
13-
#define mod_clean(mask) (mask & ~(numlock|LockMask) & \
14-
(ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
15-
1612
typedef struct {
1713
const char** com;
1814
const int i;
@@ -36,7 +32,6 @@ typedef struct client {
3632
void button_press(XEvent *e);
3733
void button_release(XEvent *e);
3834
void configure_request(XEvent *e);
39-
void input_grab(Window root);
4035
void key_press(XEvent *e);
4136
void map_request(XEvent *e);
4237
void notify_destroy(XEvent *e);

0 commit comments

Comments
 (0)