diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2017-03-01 22:29:54 +0100 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2017-03-01 22:30:20 +0100 |
commit | 05b010266898b9f1585bb6924cb00f11e87169c2 (patch) | |
tree | 05bdbd0eaa803f427d9ac1d9881127ccbaefcecc | |
parent | ac9bc1976234f6cf8b732e237192834ad43c8e81 (diff) |
ArdourButton: if _act_on_release is true, only trigger actions/signal clicks on key release, and vice versa
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
-rw-r--r-- | gtk2_ardour/ardour_button.cc | 16 | ||||
-rw-r--r-- | gtk2_ardour/ardour_button.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/engine_dialog.cc | 1 |
3 files changed, 17 insertions, 1 deletions
diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc index 91a1a9ab98..21330014a5 100644 --- a/gtk2_ardour/ardour_button.cc +++ b/gtk2_ardour/ardour_button.cc @@ -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(); diff --git a/gtk2_ardour/ardour_button.h b/gtk2_ardour/ardour_button.h index 1ad6306ae1..ddee6ce8d4 100644 --- a/gtk2_ardour/ardour_button.h +++ b/gtk2_ardour/ardour_button.h @@ -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; diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 4dc806763f..57a30abc99 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -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); |