summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2017-03-01 22:29:54 +0100
committerPaul Davis <paul@linuxaudiosystems.com>2017-03-01 22:30:20 +0100
commit05b010266898b9f1585bb6924cb00f11e87169c2 (patch)
tree05bdbd0eaa803f427d9ac1d9881127ccbaefcecc
parentac9bc1976234f6cf8b732e237192834ad43c8e81 (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.cc16
-rw-r--r--gtk2_ardour/ardour_button.h1
-rw-r--r--gtk2_ardour/engine_dialog.cc1
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);