Ensure RelevantModifierKeyMask is updated on each modifier change.
authornick_m <mainsbridge@gmail.com>
Sat, 13 Aug 2016 15:16:48 +0000 (01:16 +1000)
committernick_m <mainsbridge@gmail.com>
Sat, 13 Aug 2016 17:04:54 +0000 (03:04 +1000)
- fixes bug where changing prefs in User Interaction
  only took effect on restart.

gtk2_ardour/keyboard.cc
gtk2_ardour/keyboard.h
libs/gtkmm2ext/gtkmm2ext/keyboard.h
libs/gtkmm2ext/keyboard.cc

index 6341071451f94d3b5e99b72169e8405652ff53e2..99ab415c7e7074d812f658ada781c57d9a72fa53 100644 (file)
@@ -50,6 +50,11 @@ guint ArdourKeyboard::fine_adjust_mod = Keyboard::SecondaryModifier;
 guint ArdourKeyboard::push_points_mod = Keyboard::PrimaryModifier;
 guint ArdourKeyboard::note_size_relative_mod = Keyboard::PrimaryModifier;
 
+ArdourKeyboard::ArdourKeyboard (ARDOUR_UI& ardour_ui) : ui (ardour_ui)
+{
+       Keyboard::RelevantModifierKeysChanged.connect (sigc::mem_fun (*this, &ArdourKeyboard::reset_relevant_modifier_key_mask));
+}
+
 void
 ArdourKeyboard::find_bindings_files (map<string,string>& files)
 {
@@ -260,6 +265,18 @@ ArdourKeyboard::set_state (const XMLNode& node, int version)
        return Keyboard::set_state (node, version);
 }
 
+void
+ArdourKeyboard::reset_relevant_modifier_key_mask ()
+{
+       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | constraint_mod);
+       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_contents_mod);
+       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_overlap_mod);
+       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_anchored_mod);
+       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | fine_adjust_mod);
+       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | push_points_mod);
+       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | note_size_relative_mod);
+}
+
 /* Snap and snap delta modifiers may contain each other, so we use the
  * following two methods to sort that out:
  */
@@ -286,57 +303,50 @@ ArdourKeyboard::indicates_snap_delta (guint state)
 void
 ArdourKeyboard::set_constraint_modifier (guint mod)
 {
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~constraint_mod);
        constraint_mod = mod;
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | constraint_mod);
+       the_keyboard().reset_relevant_modifier_key_mask();
 }
 
 void
 ArdourKeyboard::set_trim_contents_modifier (guint mod)
 {
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~trim_contents_mod);
        trim_contents_mod = mod;
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_contents_mod);
+       the_keyboard().reset_relevant_modifier_key_mask();
 }
 
 void
 ArdourKeyboard::set_trim_overlap_modifier (guint mod)
 {
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~trim_overlap_mod);
        trim_overlap_mod = mod;
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_overlap_mod);
+       the_keyboard().reset_relevant_modifier_key_mask();
 }
 
 void
 ArdourKeyboard::set_trim_anchored_modifier (guint mod)
 {
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~trim_anchored_mod);
        trim_anchored_mod = mod;
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | trim_anchored_mod);
+       the_keyboard().reset_relevant_modifier_key_mask();
 }
 
 void
 ArdourKeyboard::set_fine_adjust_modifier (guint mod)
 {
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~fine_adjust_mod);
        fine_adjust_mod = mod;
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | fine_adjust_mod);
+       the_keyboard().reset_relevant_modifier_key_mask();
 }
 
 void
 ArdourKeyboard::set_push_points_modifier (guint mod)
 {
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~push_points_mod);
        push_points_mod = mod;
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | push_points_mod);
+       the_keyboard().reset_relevant_modifier_key_mask();
 }
 
 void
 ArdourKeyboard::set_note_size_relative_modifier (guint mod)
 {
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask & ~note_size_relative_mod);
        note_size_relative_mod = mod;
-       RelevantModifierKeyMask = GdkModifierType (RelevantModifierKeyMask | note_size_relative_mod);
+       the_keyboard().reset_relevant_modifier_key_mask();
 }
 
 Selection::Operation
index c6a05abe2a4ca5f5895d78e0781e1355ac9f0ad9..e008a40128b7ced21cc3b8c9ab3b9265d8b5f205 100644 (file)
@@ -33,7 +33,7 @@ class ARDOUR_UI;
 class ArdourKeyboard : public Gtkmm2ext::Keyboard
 {
   public:
-       ArdourKeyboard(ARDOUR_UI& ardour_ui) : ui(ardour_ui) {}
+       ArdourKeyboard(ARDOUR_UI&);
 
        XMLNode& get_state (void);
        int set_state (const XMLNode&, int version);
@@ -44,6 +44,8 @@ class ArdourKeyboard : public Gtkmm2ext::Keyboard
 
        ARDOUR_UI& ui;
 
+       void reset_relevant_modifier_key_mask ();
+
        /** @param state The button state from a GdkEvent.
         *  @return true if the modifier state indicates snap modifier
         */
index 58af25f9d20c582837760f89d616d357b3938a9d..316fdd7fe374f26f9967ec2dc90f98df4d3990c5 100644 (file)
@@ -51,6 +51,7 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
        int set_state (const XMLNode&, int version);
 
        virtual void setup_keybindings () = 0;
+       static void reset_relevant_modifier_key_mask ();
 
        typedef std::vector<uint32_t> State;
        typedef uint32_t ModifierMask;
@@ -183,6 +184,7 @@ class LIBGTKMM2EXT_API Keyboard : public sigc::trackable, PBD::Stateful
        int reset_bindings ();
 
        sigc::signal0<void> ZoomVerticalModifierReleased;
+       static sigc::signal0<void> RelevantModifierKeysChanged;
 
   protected:
        static Keyboard* _the_keyboard;
index 135e1fdc5650bf0f94e65e885c02aafcf088608f..fe7303b290295eb8bdc4d42560ebbaab2ba21c58 100644 (file)
@@ -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);
 }
@@ -359,6 +328,45 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event)
        return ret;
 }
 
+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 ()
 {
@@ -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