|
@@ -955,16 +955,26 @@ grabkeys(void)
|
|
|
{
|
|
{
|
|
|
updatenumlockmask();
|
|
updatenumlockmask();
|
|
|
{
|
|
{
|
|
|
- unsigned int i, j;
|
|
|
|
|
|
|
+ unsigned int i, j, k;
|
|
|
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
|
|
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
|
|
|
- KeyCode code;
|
|
|
|
|
|
|
+ int start, end, skip;
|
|
|
|
|
+ KeySym *syms;
|
|
|
|
|
|
|
|
XUngrabKey(dpy, AnyKey, AnyModifier, root);
|
|
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);
|
|
|
|
|
+ XFree(syms);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|