- /* This function builds a lookup table to provide rapid answers to
- the question: what, if any, modmask, is associated with a given
- keycode ?
- */
-
- modifiers = XGetModifierMapping (GDK_DISPLAY());
-
- modifier_masks = new int32_t [max_keycode+1];
-
- keycode = modifiers->modifiermap;
-
- for (i = 0; i < modifiers->max_keypermod; ++i) { /* shift */
- if (*keycode) {
- modifier_masks[*keycode] = GDK_SHIFT_MASK;
- // cerr << "Shift = " << XKeysymToString (XKeycodeToKeysym (GDK_DISPLAY(), *keycode, 0)) << endl;
- }
- keycode++;
- }
-
- for (i = 0; i < modifiers->max_keypermod; ++i) keycode++; /* skip lock */
-
- for (i = 0; i < modifiers->max_keypermod; ++i) { /* control */
- if (*keycode) {
- modifier_masks[*keycode] = GDK_CONTROL_MASK;
- // cerr << "Control = " << XKeysymToString (XKeycodeToKeysym (GDK_DISPLAY(), *keycode, 0)) << endl;
- }
- keycode++;
- }
-
- bound = 0;
- for (i = 0; i < modifiers->max_keypermod; ++i) { /* mod 1 */
- if (*keycode) {
- modifier_masks[*keycode] = GDK_MOD1_MASK;
- // cerr << "Mod1 = " << XKeysymToString (XKeycodeToKeysym (GDK_DISPLAY(), *keycode, 0)) << endl;
- bound++;
- }
- keycode++;
- }
-#ifdef WARN_ABOUT_DUPLICATE_MODIFIERS
- if (bound > 1) {
- warning << compose (_("You have %1 keys bound to \"mod1\""), bound) << endmsg;
- }
-#endif
- bound = 0;
- for (i = 0; i < modifiers->max_keypermod; ++i) { /* mod2 */
- if (*keycode) {
- modifier_masks[*keycode] = GDK_MOD2_MASK;
- check_meta_numlock (*keycode, GDK_MOD2_MASK, "Mod2");
- //cerr << "Mod2 = " << std::hex << (int) *keycode << std::dec << " = " << XKeysymToString (XKeycodeToKeysym (GDK_DISPLAY(), *keycode, 0)) << endl;
- bound++;
- }
- keycode++;
- }
-#ifdef WARN_ABOUT_DUPLICATE_MODIFIERS
- if (bound > 1) {
- warning << compose (_("You have %1 keys bound to \"mod2\""), bound) << endmsg;
- }
-#endif
- bound = 0;
- for (i = 0; i < modifiers->max_keypermod; ++i) { /* mod3 */
- if (*keycode) {
- modifier_masks[*keycode] = GDK_MOD3_MASK;
- check_meta_numlock (*keycode, GDK_MOD3_MASK, "Mod3");
- // cerr << "Mod3 = " << XKeysymToString (XKeycodeToKeysym (GDK_DISPLAY(), *keycode, 0)) << endl;
- bound++;
- }
- keycode++;
- }
-#ifdef WARN_ABOUT_DUPLICATE_MODIFIERS
- if (bound > 1) {
- warning << compose (_("You have %1 keys bound to \"mod3\""), bound) << endmsg;
- }
-#endif
- bound = 0;
- for (i = 0; i < modifiers->max_keypermod; ++i) { /* mod 4 */
- if (*keycode) {
- modifier_masks[*keycode] = GDK_MOD4_MASK;
- check_meta_numlock (*keycode, GDK_MOD4_MASK, "Mod4");
- // cerr << "Mod4 = " << XKeysymToString (XKeycodeToKeysym (GDK_DISPLAY(), *keycode, 0)) << endl;
- bound++;
- }
- keycode++;
- }
-#ifdef WARN_ABOUT_DUPLICATE_MODIFIERS
- if (bound > 1) {
- warning << compose (_("You have %1 keys bound to \"mod4\""), bound) << endmsg;
- }
-#endif
- bound = 0;
- for (i = 0; i < modifiers->max_keypermod; ++i) { /* mod 5 */
- if (*keycode) {
- modifier_masks[*keycode] = GDK_MOD5_MASK;
- check_meta_numlock (*keycode, GDK_MOD5_MASK, "Mod5");
- // cerr << "Mod5 = " << XKeysymToString (XKeycodeToKeysym (GDK_DISPLAY(), *keycode, 0)) << endl;
- bound++;
- }
- keycode++;
- }
-#ifdef WARN_ABOUT_DUPLICATE_MODIFIERS
- if (bound > 1) {
- warning << compose (_("You have %1 keys bound to \"mod5\""), bound) << endmsg;
- }
-#endif
-
- XFreeModifiermap (modifiers);