summaryrefslogtreecommitdiff
path: root/gtk2_ardour/ardour_button.cc
diff options
context:
space:
mode:
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)
{