ArdourButton: if _act_on_release is true, only trigger actions/signal clicks on key...
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 1 Mar 2017 21:29:54 +0000 (22:29 +0100)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 1 Mar 2017 21:30:20 +0000 (22:30 +0100)
This should really be split in separate semantics for key and button events.

Fixes a subtle but nasty bug in the EngineDialog where the change of the default focus
widget from a Gtk::Button (acts on press) to an ArdourButton (acts on release) caused
events occuring after a dialog has grabbed focus to trigger button clicks

gtk2_ardour/ardour_button.cc
gtk2_ardour/ardour_button.h
gtk2_ardour/engine_dialog.cc

index 91a1a9ab98f47a965fadcf2d311a40d5d5a91ac8..21330014a535edb1e4b98931762271a5ab046b7e 100644 (file)
@@ -1107,7 +1107,21 @@ ArdourButton::on_focus_out_event (GdkEventFocus* ev)
 
 bool
 ArdourButton::on_key_release_event (GdkEventKey *ev) {
-       if (_focused &&
+       if (_act_on_release && _focused &&
+                       (ev->keyval == GDK_space || ev->keyval == GDK_Return))
+       {
+               signal_clicked();
+               if (_action) {
+                       _action->activate ();
+               }
+               return true;
+       }
+       return CairoWidget::on_key_release_event (ev);
+}
+
+bool
+ArdourButton::on_key_press_event (GdkEventKey *ev) {
+       if (!_act_on_release && _focused &&
                        (ev->keyval == GDK_space || ev->keyval == GDK_Return))
        {
                signal_clicked();
index 1ad6306ae1a8b71bb222ba138091e42124f18fd7..ddee6ce8d4ae8de3a98c02d7a05b50542dbaaf06 100644 (file)
@@ -139,6 +139,7 @@ class ArdourButton : public CairoWidget , public Gtkmm2ext::Activatable
        bool on_focus_in_event (GdkEventFocus*);
        bool on_focus_out_event (GdkEventFocus*);
        bool on_key_release_event (GdkEventKey *);
+       bool on_key_press_event (GdkEventKey *);
 
        void controllable_changed ();
        PBD::ScopedConnection watch_connection;
index 4dc806763fcea6751f0bffddd5a9d6981a625eaf..57a30abc9906df4a0c8f051419194118ccadc6d7 100644 (file)
@@ -280,6 +280,7 @@ EngineControl::EngineControl ()
        start_stop_button.set_name ("generic button");
        start_stop_button.set_can_focus(true);
        start_stop_button.set_can_default(true);
+       start_stop_button.set_act_on_release (false);
 
        update_devices_button.signal_clicked.connect (mem_fun (*this, &EngineControl::update_devices_button_clicked));
        update_devices_button.set_sensitive (false);