XISetMask (mask.mask, XI_KeyRelease);
XIGrabModifiers ximodifiers[] = {
- {modifiers, 0},
- {Mod2Mask | modifiers, 0},
- {LockMask | modifiers, 0},
- {Mod5Mask | modifiers, 0},
- {Mod2Mask | LockMask | modifiers, 0},
- {Mod2Mask | Mod5Mask | modifiers, 0},
- {LockMask | Mod5Mask | modifiers, 0},
- {Mod2Mask | LockMask | Mod5Mask | modifiers, 0},
+ { modifiers, 0 },
+ { LockMask | modifiers, 0 },
+ { Mod2Mask | modifiers, 0 },
+ { Mod5Mask | modifiers, 0 },
+ { LockMask | Mod2Mask | modifiers, 0 },
+ { Mod2Mask | Mod5Mask | modifiers, 0 },
+ { LockMask | Mod5Mask | modifiers, 0 },
+ { LockMask | Mod2Mask | Mod5Mask | modifiers, 0 },
};
int retval = XIGrabKeycode (xdisplay,
public static const uint MODIFIER_FILTER =
Gdk.ModifierType.MODIFIER_MASK & ~(
- Gdk.ModifierType.MOD2_MASK |
- Gdk.ModifierType.LOCK_MASK |
- Gdk.ModifierType.MOD4_MASK |
- Gdk.ModifierType.MOD5_MASK |
+ Gdk.ModifierType.LOCK_MASK | // Caps Lock
+ // Gdk.ModifierType.MOD1_MASK | // Alt
+ Gdk.ModifierType.MOD2_MASK | // Num Lock
+ // Gdk.ModifierType.MOD3_MASK |
+ // Gdk.ModifierType.MOD4_MASK | // Super, Hyper
+ // Gdk.ModifierType.MOD5_MASK | //
Gdk.ModifierType.BUTTON1_MASK |
Gdk.ModifierType.BUTTON2_MASK |
Gdk.ModifierType.BUTTON3_MASK |
Gdk.ModifierType.BUTTON4_MASK |
- Gdk.ModifierType.BUTTON5_MASK);
+ Gdk.ModifierType.BUTTON5_MASK |
+ Gdk.ModifierType.SUPER_MASK |
+ Gdk.ModifierType.HYPER_MASK |
+ Gdk.ModifierType.META_MASK);
/**
* Helper class to store keybinding
private void event_handler(Gdk.Event event) {
do {
- if (event.any.window != Gdk.get_default_root_window())
+ if (event.any.window != Gdk.get_default_root_window()) {
break;
+ }
if (event.type == Gdk.EventType.KEY_PRESS) {
uint modifiers = event.key.state & MODIFIER_FILTER;
private void bind_switch_shortcut() {
var keybinding_manager = KeybindingManager.get_instance();
- Gtk.accelerator_parse(ACCELERATOR_SWITCH_IME_FOREWARD,
+ var accelerator = ACCELERATOR_SWITCH_IME_FOREWARD;
+ Gtk.accelerator_parse(accelerator,
out m_switch_keysym, out m_switch_modifiers);
+ // Map virtual modifiers to (i.e.Mod2, Mod3, ...)
+ const Gdk.ModifierType VIRTUAL_MODIFIERS = (
+ Gdk.ModifierType.SUPER_MASK |
+ Gdk.ModifierType.HYPER_MASK |
+ Gdk.ModifierType.META_MASK);
+ if ((m_switch_modifiers & VIRTUAL_MODIFIERS) != 0) {
+ // workaround a bug in gdk vapi vala > 0.18
+ // https://bugzilla.gnome.org/show_bug.cgi?id=677559
+#if VALA_0_18
+ Gdk.Keymap.get_default().map_virtual_modifiers(
+ ref m_switch_modifiers);
+#else
+ if ((m_switch_modifiers & Gdk.ModifierType.SUPER_MASK) != 0)
+ m_switch_modifiers |= Gdk.ModifierType.MOD4_MASK;
+ if ((m_switch_modifiers & Gdk.ModifierType.HYPER_MASK) != 0)
+ m_switch_modifiers |= Gdk.ModifierType.MOD4_MASK;
+#endif
+ m_switch_modifiers &= ~VIRTUAL_MODIFIERS;
+ }
+
if (m_switch_keysym == 0 && m_switch_modifiers == 0) {
- warning("Parse accelerator '%s' failed!",
- ACCELERATOR_SWITCH_IME_FOREWARD);
+ warning("Parse accelerator '%s' failed!", accelerator);
return;
}