summaryrefslogtreecommitdiff
path: root/libs/gtkmm2ext
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-02-21 10:40:28 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2016-02-21 10:48:35 -0500
commit344cf05540126a96d875bd124c804a8df3eac4e8 (patch)
tree338dcb93190a755afdb239d601079f0ec11e77c1 /libs/gtkmm2ext
parent13552140a2589e12271e3744d9f8b8ab77eeabfe (diff)
OS X: fix the handling of SUPER,HYPER,META (see code comment for more)
Diffstat (limited to 'libs/gtkmm2ext')
-rw-r--r--libs/gtkmm2ext/keyboard.cc31
1 files changed, 21 insertions, 10 deletions
diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc
index 0f9aeb028f..d59fe014ce 100644
--- a/libs/gtkmm2ext/keyboard.cc
+++ b/libs/gtkmm2ext/keyboard.cc
@@ -143,11 +143,31 @@ Keyboard::Keyboard ()
RelevantModifierKeyMask = (GdkModifierType) gtk_accelerator_get_default_mod_mask ();
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | PrimaryModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | SecondaryModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | TertiaryModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | Level4Modifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | CopyModifier);
+ RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | RangeSelectModifier);
+
+ gtk_accelerator_set_default_mod_mask (RelevantModifierKeyMask);
+
#ifdef __APPLE__
/* Remove SUPER,HYPER,META.
*
* GTK on OS X adds META when Command is pressed for various indefensible reasons, since
- * it also uses MOD2 to indicate Command.
+ * it also uses MOD2 to indicate Command. Our code assumes that each
+ * modifier (Primary, Secondary etc.) is represented by a single bit in
+ * the modifier mask, but GTK's (STUPID) design uses two (MOD2 + META)
+ * to represent the Command key. Some discussion about this is here:
+ * https://bugzilla.gnome.org/show_bug.cgi?id=692597
+ *
+ * We cannot do this until AFTER we told GTK what the default modifier
+ * was, because otherwise it will fail to recognize MOD2-META-<key> as
+ * an accelerator.
+ *
+ * Note that in the tabbed branch, we no longer use GTK accelerators
+ * for functional purposes, so this is as critical for that branch.
*/
RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_SUPER_MASK);
@@ -155,15 +175,6 @@ Keyboard::Keyboard ()
RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_META_MASK);
#endif
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | PrimaryModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | SecondaryModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | TertiaryModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | Level4Modifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | CopyModifier);
- RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | RangeSelectModifier);
-
- gtk_accelerator_set_default_mod_mask (RelevantModifierKeyMask);
-
snooper_id = gtk_key_snooper_install (_snooper, (gpointer) this);
}