From c2b1748de7cd2cc61c90413b3d53113e1b467748 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 12 Dec 2024 17:32:36 +0100 Subject: [PATCH] Emulate GTK button events for signal-proxy connections --- libs/widgets/ardour_button.cc | 59 ++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/libs/widgets/ardour_button.cc b/libs/widgets/ardour_button.cc index 8d8023b213..81e436ed22 100644 --- a/libs/widgets/ardour_button.cc +++ b/libs/widgets/ardour_button.cc @@ -951,37 +951,46 @@ ArdourButton::set_led_left (bool yn) bool ArdourButton::on_touch_begin_event (GdkEventTouch *ev) { - printf ("ArdourButton::on_touch_begin_event finger %d\n", ev->sequence); - focus_handler (this); - - CairoWidget::set_dirty (); - - if (!_act_on_release) { - if (_action) { - _action->activate (); - } else if (_auto_toggle) { - set_active (!get_active ()); - signal_clicked (); - } - } - return true; + /* Emulate button event to trigger RouteUI + * signal_button_press_event().connect (..) callbacks + */ + GdkEventButton bev; + bev.type = GDK_BUTTON_PRESS; + bev.button = 1; + bev.window = ev->window; + bev.time = ev->time; + bev.x = ev->x; + bev.y = ev->y; + bev.x_root = ev->x_root; + bev.y_root = ev->y_root; + bev.state = 0; + bev.axes = NULL; + bev.device = NULL; + _hovering = true; + return event ((GdkEvent*)&bev); } bool ArdourButton::on_touch_end_event (GdkEventTouch *ev) { - printf ("ArdourButton::on_touch_end_event finger: %d\n", ev->sequence); - CairoWidget::set_dirty (); + /* Emulate button event to trigger RouteUI + * signal_button_release_event().connect (..) callbacks + */ + GdkEventButton bev; + bev.type = GDK_BUTTON_RELEASE; + bev.button = 1; + bev.window = ev->window; + bev.time = ev->time; + bev.x = ev->x; + bev.y = ev->y; + bev.x_root = ev->x_root; + bev.y_root = ev->y_root; + bev.state = 0; + bev.axes = NULL; + bev.device = NULL; - if (_act_on_release && _auto_toggle && !_action) { - set_active (!get_active ()); - } - signal_clicked (); - if (_act_on_release && _action) { - _action->activate (); - } - - return true; + _hovering = false; + return event ((GdkEvent*)&bev); } bool