summaryrefslogtreecommitdiff
path: root/src/keyboard.c
diff options
context:
space:
mode:
authorOlivier Fourdan <fourdan.olivier@wanadoo.fr>2007-05-01 22:22:37 +0000
committerOlivier Fourdan <fourdan.olivier@wanadoo.fr>2007-05-01 22:22:37 +0000
commitbe7af6aeaf356fcfca3b08611f8d849d80de9f22 (patch)
treea6ccd96ffa41b804cced2682ef64f37e852b325f /src/keyboard.c
parent19420d17678fc32c7386e8ce477188ccde3489c2 (diff)
downloadxfwm4-be7af6aeaf356fcfca3b08611f8d849d80de9f22.tar.gz
Change modifier mapping (Bug #3194)
(Old svn revision: 25665)
Diffstat (limited to 'src/keyboard.c')
-rw-r--r--src/keyboard.c128
1 files changed, 56 insertions, 72 deletions
diff --git a/src/keyboard.c b/src/keyboard.c
index bb25d6be4..5ca3ff4c2 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -306,11 +306,17 @@ ungrabButton (Display * dpy, int button, int modifier, Window w)
}
}
+#define set_mask(m_mask, mask_cnt) if (!m_mask) m_mask = (1 << mask_cnt);
void
initModifiers (Display * dpy)
{
- XModifierKeymap *xmk = XGetModifierMapping (dpy);
- int m, k;
+ XModifierKeymap *modmap;
+ KeySym *keymap;
+ unsigned int keycode;
+ int min_keycode;
+ int max_keycode;
+ int keysyms_per_keycode;
+ int i;
AltMask = 0;
MetaMask = 0;
@@ -318,76 +324,54 @@ initModifiers (Display * dpy)
ScrollLockMask = 0;
SuperMask = 0;
HyperMask = 0;
-
- if (xmk)
- {
- KeyCode *c = xmk->modifiermap;
- KeyCode numLockKeyCode;
- KeyCode scrollLockKeyCode;
- KeyCode altKeyCode;
- KeyCode metaKeyCode;
- KeyCode superKeyCode;
- KeyCode hyperKeyCode;
-
- numLockKeyCode = XKeysymToKeycode (dpy, XK_Num_Lock);
- scrollLockKeyCode = XKeysymToKeycode (dpy, XK_Scroll_Lock);
- altKeyCode = XKeysymToKeycode (dpy, XK_Alt_L);
- metaKeyCode = XKeysymToKeycode (dpy, XK_Meta_L);
- superKeyCode = XKeysymToKeycode (dpy, XK_Super_L);
- hyperKeyCode = XKeysymToKeycode (dpy, XK_Hyper_L);
-
- if (!altKeyCode)
- {
- altKeyCode = XKeysymToKeycode (dpy, XK_Alt_R);
- }
- if (!metaKeyCode)
- {
- metaKeyCode = XKeysymToKeycode (dpy, XK_Meta_R);
- }
- if (!superKeyCode)
- {
- superKeyCode = XKeysymToKeycode (dpy, XK_Super_R);
- }
- if (!hyperKeyCode)
- {
- hyperKeyCode = XKeysymToKeycode (dpy, XK_Hyper_R);
- }
-
- for (m = 0; m < 8; m++)
- {
- for (k = 0; k < xmk->max_keypermod; k++, c++)
- {
- if (*c == NoSymbol)
- {
- continue;
- }
- if (*c == numLockKeyCode)
- {
- NumLockMask = (1 << m);
- }
- if (*c == scrollLockKeyCode)
- {
- ScrollLockMask = (1 << m);
- }
- if (*c == altKeyCode)
- {
- AltMask = (1 << m);
- }
- if (*c == metaKeyCode)
- {
- MetaMask = (1 << m);
- }
- if (*c == superKeyCode)
- {
- SuperMask = (1 << m);
- }
- if (*c == hyperKeyCode)
- {
- HyperMask = (1 << m);
- }
- }
- }
- XFreeModifiermap (xmk);
+ keysyms_per_keycode = 0;
+ min_keycode = 0;
+ max_keycode = 0;
+
+ XDisplayKeycodes (dpy, &min_keycode, &max_keycode);
+ modmap = XGetModifierMapping (dpy);
+ keymap = XGetKeyboardMapping (dpy, min_keycode, max_keycode - min_keycode + 1, &keysyms_per_keycode);
+
+ if (modmap)
+ {
+ for (i = 3 * modmap->max_keypermod; i < 8 * modmap->max_keypermod; i++)
+ {
+ keycode = modmap->modifiermap[i];
+ if ((keycode >= min_keycode) && (keycode <= max_keycode))
+ {
+ int j;
+ KeySym *syms = keymap + (keycode - min_keycode) * keysyms_per_keycode;
+
+ for (j = 0; j < keysyms_per_keycode; j++)
+ {
+ if (syms[j] == XK_Num_Lock)
+ {
+ set_mask(NumLockMask, (i / modmap->max_keypermod));
+ }
+ else if (syms[j] == XK_Scroll_Lock)
+ {
+ set_mask(ScrollLockMask, (i / modmap->max_keypermod));
+ }
+ else if ((syms[j] == XK_Alt_L) || (syms[j] == XK_Alt_R))
+ {
+ set_mask(AltMask, (i / modmap->max_keypermod));
+ }
+ else if ((syms[j] == XK_Super_L) || (syms[j] == XK_Super_R))
+ {
+ set_mask(SuperMask, (i / modmap->max_keypermod));
+ }
+ else if ((syms[j] == XK_Hyper_L) || (syms[j] == XK_Hyper_R))
+ {
+ set_mask(HyperMask, (i / modmap->max_keypermod));
+ }
+ else if ((syms[j] == XK_Meta_L) || (syms[j] == XK_Meta_R))
+ {
+ set_mask(MetaMask, (i / modmap->max_keypermod));
+ }
+ }
+ }
+ }
+ XFreeModifiermap (modmap);
}
if (MetaMask == AltMask)