summaryrefslogtreecommitdiff
path: root/gtk2_ardour/ardour_button.cc
diff options
context:
space:
mode:
authorJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>2016-08-18 16:09:50 +0200
committerJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>2016-08-18 16:16:17 +0200
commit523306036e0aa57e6e72eacff3a6ee33952af583 (patch)
treec976cf36055a2ab5cbd5ea9f714022b2f75e2373 /gtk2_ardour/ardour_button.cc
parent0ab81183c0a36b091ed7a51edba85edd48b5e364 (diff)
Make ArdourButton detect when a grab should stop being pressed
If for whatever reason a grab is taken (e.g. a menu popping up) while somebody is pressing a mouse button on an ArdourButton, then the ArdourButton will not get the mouse button release event and will look stuck in pressed position. The leave notify event is fired if the mouse is still on the ArdourButton while the grab is taken, but not if the user was dragging the mouse outside of the button. The only reliable way is to listen for the grab_broken_event signal. Do so.
Diffstat (limited to 'gtk2_ardour/ardour_button.cc')
-rw-r--r--gtk2_ardour/ardour_button.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/gtk2_ardour/ardour_button.cc b/gtk2_ardour/ardour_button.cc
index 56854880d8..ae9eb310d5 100644
--- a/gtk2_ardour/ardour_button.cc
+++ b/gtk2_ardour/ardour_button.cc
@@ -97,6 +97,8 @@ ArdourButton::ArdourButton (Element e)
, _pattern_height (0)
{
UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ArdourButton::color_handler));
+ /* This is not provided by gtkmm */
+ signal_grab_broken_event().connect (sigc::mem_fun (*this, &ArdourButton::on_grab_broken_event));
}
ArdourButton::ArdourButton (const std::string& str, Element e)
@@ -140,6 +142,8 @@ ArdourButton::ArdourButton (const std::string& str, Element e)
set_text (str);
UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ArdourButton::color_handler));
UIConfiguration::instance().DPIReset.connect (sigc::mem_fun (*this, &ArdourButton::on_name_changed));
+ /* This is not provided by gtkmm */
+ signal_grab_broken_event().connect (sigc::mem_fun (*this, &ArdourButton::on_grab_broken_event));
}
ArdourButton::~ArdourButton()
@@ -1060,6 +1064,16 @@ ArdourButton::on_leave_notify_event (GdkEventCrossing* ev)
return CairoWidget::on_leave_notify_event (ev);
}
+bool
+ArdourButton::on_grab_broken_event(GdkEventGrabBroken* grab_broken_event) {
+ /* Our implicit grab due to a button_press was broken by another grab:
+ * the button will not get any button_release event if the mouse leaves
+ * while the grab is taken, so unpress ourselves */
+ _grabbed = false;
+ CairoWidget::set_dirty ();
+ return true;
+}
+
void
ArdourButton::set_tweaks (Tweaks t)
{