diff --git a/spmenu.c b/spmenu.c index 3f8dd0f..d3f7f9d 100644 --- a/spmenu.c +++ b/spmenu.c @@ -1100,31 +1100,50 @@ move(const Arg *arg) } } +void +updatenumlockmask(void) +{ + unsigned int i, j; + XModifierKeymap *modmap; + + numlockmask = 0; + 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); +} + void keypress(XEvent *e) { - unsigned int i; - KeySym keysym; - XKeyEvent *ev; - char buf[64]; - KeySym ksym = NoSymbol; - Status status; + updatenumlockmask(); + { + unsigned int i; + KeySym keysym; + XKeyEvent *ev; + char buf[64]; + KeySym ksym = NoSymbol; + Status status; - int len = 0; - ev = &e->xkey; - len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); + int len = 0; + ev = &e->xkey; + len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); - keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); + 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) && keys[i].func) - keys[i].func(&(keys[i].arg)); - } + for (i = 0; i < LENGTH(keys); i++) { + if (keysym == keys[i].keysym && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) && keys[i].func) + keys[i].func(&(keys[i].arg)); + } - if (!iscntrl(*buf) && type) { - insert(buf, len); + if (!iscntrl(*buf) && type) { + insert(buf, len); - drawmenu(); + drawmenu(); + } } }