diff options
Diffstat (limited to 'gtk2_ardour/ardour_button.cc')
-rw-r--r-- | gtk2_ardour/ardour_button.cc | 14 |
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) { |