summaryrefslogtreecommitdiffhomepage
path: root/dwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'dwm.c')
-rw-r--r--dwm.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/dwm.c b/dwm.c
index 60b25ea..7dbf150 100644
--- a/dwm.c
+++ b/dwm.c
@@ -2281,24 +2281,38 @@ grabkeys(void)
{
updatenumlockmask();
{
- unsigned int i, j;
+ unsigned int i, j, k;
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
- KeyCode code;
+ int start, end, skip;
+ KeySym *syms;
XUngrabKey(dpy, AnyKey, AnyModifier, root);
- for (i = 0; i < LENGTH(keys); i++)
- if ((code = XKeysymToKeycode(dpy, keys[i].keysym)))
- for (j = 0; j < LENGTH(modifiers); j++)
- XGrabKey(dpy, code, keys[i].mod | modifiers[j], root,
- True, GrabModeAsync, GrabModeAsync);
+ XDisplayKeycodes(dpy, &start, &end);
+ syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip);
+ if (!syms)
+ return;
+ for (k = start; k <= end; k++)
+ for (i = 0; i < LENGTH(keys); i++)
+ /* skip modifier codes, we do that ourselves */
+ if (keys[i].keysym == syms[(k - start) * skip])
+ for (j = 0; j < LENGTH(modifiers); j++)
+ XGrabKey(dpy, k,
+ keys[i].mod | modifiers[j],
+ root, True,
+ GrabModeAsync, GrabModeAsync);
#if ON_EMPTY_KEYS_PATCH
if (!selmon->sel)
- for (i = 0; i < LENGTH(on_empty_keys); i++)
- if ((code = XKeysymToKeycode(dpy, on_empty_keys[i].keysym)))
- for (j = 0; j < LENGTH(modifiers); j++)
- XGrabKey(dpy, code, on_empty_keys[i].mod | modifiers[j], root,
- True, GrabModeAsync, GrabModeAsync);
+ for (k = start; k <= end; k++)
+ for (i = 0; i < LENGTH(on_empty_keys); i++)
+ /* skip modifier codes, we do that ourselves */
+ if (on_empty_keys[i].keysym == syms[(k - start) * skip])
+ for (j = 0; j < LENGTH(modifiers); j++)
+ XGrabKey(dpy, k,
+ on_empty_keys[i].mod | modifiers[j],
+ root, True,
+ GrabModeAsync, GrabModeAsync);
#endif // ON_EMPTY_KEYS_PATCH
+ XFree(syms);
}
}