diff options
author | nick_m <mainsbridge@gmail.com> | 2016-08-14 01:16:48 +1000 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2016-08-14 03:04:54 +1000 |
commit | c62026b5679810d4633c1a2de841daf29dda9dc6 (patch) | |
tree | 74b8fb05eb242c54ad1d6cf148e6cf5f81e86c41 /libs/gtkmm2ext/keyboard.cc | |
parent | 1c0651f7f4974fb404cf89f2233df01192ec1b24 (diff) |
Ensure RelevantModifierKeyMask is updated on each modifier change.
- fixes bug where changing prefs in User Interaction
only took effect on restart.
Diffstat (limited to 'libs/gtkmm2ext/keyboard.cc')
-rw-r--r-- | libs/gtkmm2ext/keyboard.cc | 92 |
1 files changed, 47 insertions, 45 deletions
diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc index 135e1fdc56..fe7303b290 100644 --- a/libs/gtkmm2ext/keyboard.cc +++ b/libs/gtkmm2ext/keyboard.cc @@ -127,6 +127,7 @@ Gtk::Window* Keyboard::pre_dialog_active_window = 0; /* set this to initially contain the modifiers we care about, then track changes in ::set_edit_modifier() etc. */ GdkModifierType Keyboard::RelevantModifierKeyMask; +sigc::signal0<void> Keyboard::RelevantModifierKeysChanged; void Keyboard::magic_widget_grab_focus () @@ -153,39 +154,7 @@ Keyboard::Keyboard () _current_binding_name = _("Unknown"); } - 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. 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); - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_HYPER_MASK); - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_META_MASK); -#endif + reset_relevant_modifier_key_mask(); snooper_id = gtk_key_snooper_install (_snooper, (gpointer) this); } @@ -360,6 +329,45 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event) } void +Keyboard::reset_relevant_modifier_key_mask () +{ + 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. 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); + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_HYPER_MASK); + RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~GDK_META_MASK); +#endif + RelevantModifierKeysChanged(); /* EMIT SIGNAL */ +} + +void Keyboard::close_current_dialog () { if (current_window) { @@ -471,9 +479,8 @@ Keyboard::set_edit_button (guint but) void Keyboard::set_edit_modifier (guint mod) { - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~edit_mod); edit_mod = mod; - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | edit_mod); + reset_relevant_modifier_key_mask(); } void @@ -485,9 +492,8 @@ Keyboard::set_delete_button (guint but) void Keyboard::set_delete_modifier (guint mod) { - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~delete_mod); delete_mod = mod; - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | delete_mod); + reset_relevant_modifier_key_mask(); } void @@ -499,34 +505,30 @@ Keyboard::set_insert_note_button (guint but) void Keyboard::set_insert_note_modifier (guint mod) { - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~insert_note_mod); insert_note_mod = mod; - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | insert_note_mod); + reset_relevant_modifier_key_mask(); } void Keyboard::set_modifier (uint32_t newval, uint32_t& var) { - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~var); var = newval; - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | var); + reset_relevant_modifier_key_mask(); } void Keyboard::set_snap_modifier (guint mod) { - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~snap_mod); snap_mod = mod; - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | snap_mod); + reset_relevant_modifier_key_mask(); } void Keyboard::set_snap_delta_modifier (guint mod) { - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~snap_delta_mod); snap_delta_mod = mod; - RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | snap_delta_mod); + reset_relevant_modifier_key_mask(); } bool |