From 95949e62675bbc2c6b0395415e4247019b70576c Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 15 Apr 2025 21:59:40 +0200 Subject: [PATCH] Implement multi-touch support for ArdourKnobs --- libs/widgets/ardour_ctrl_base.cc | 36 +++++++++++++++++++++++++ libs/widgets/widgets/ardour_ctrl_base.h | 3 +++ 2 files changed, 39 insertions(+) diff --git a/libs/widgets/ardour_ctrl_base.cc b/libs/widgets/ardour_ctrl_base.cc index 857efa3280..303501ac37 100644 --- a/libs/widgets/ardour_ctrl_base.cc +++ b/libs/widgets/ardour_ctrl_base.cc @@ -60,6 +60,7 @@ ArdourCtrlBase::ArdourCtrlBase (Flags flags) , _dead_zone_delta (0) { UIConfigurationBase::instance().ColorsChanged.connect (sigc::mem_fun (*this, &ArdourCtrlBase::color_handler)); + add_events (Gdk::TOUCH_UPDATE_MASK | Gdk::TOUCH_BEGIN_MASK | Gdk::TOUCH_END_MASK); #ifdef VBM _flags = (Flags)(static_cast (_flags) | (int)NoHorizontal); @@ -257,6 +258,41 @@ ArdourCtrlBase::on_button_release_event (GdkEventButton *ev) return true; } +bool +ArdourCtrlBase::on_touch_begin_event (GdkEventTouch *ev) +{ + _grabbed_x = ev->x; + _grabbed_y = ev->y; + _dead_zone_delta = 0; + _grabbed = true; + _tooltip.start_drag(); + set_active_state (Gtkmm2ext::ExplicitActive); + StartGesture (ev->state); + return true; +} + +bool +ArdourCtrlBase::on_touch_end_event (GdkEventTouch *ev) +{ + _tooltip.stop_drag(); + _grabbed = false; + StopGesture (ev->state); + unset_active_state (); + return true; +} + +bool +ArdourCtrlBase::on_touch_update_event (GdkEventTouch* ev) +{ + GdkEventMotion mev; + mev.window = ev->window; + mev.time = ev->time; + mev.x = ev->x; + mev.y = ev->y; + mev.state = Gdk::BUTTON1_MASK; + return ArdourCtrlBase::on_motion_notify_event (&mev); +} + void ArdourCtrlBase::color_handler () { diff --git a/libs/widgets/widgets/ardour_ctrl_base.h b/libs/widgets/widgets/ardour_ctrl_base.h index 7d0e541257..df252c0f5c 100644 --- a/libs/widgets/widgets/ardour_ctrl_base.h +++ b/libs/widgets/widgets/ardour_ctrl_base.h @@ -77,6 +77,9 @@ public: bool on_button_release_event (GdkEventButton*); bool on_scroll_event (GdkEventScroll* ev); bool on_motion_notify_event (GdkEventMotion *ev) ; + bool on_touch_begin_event (GdkEventTouch*); + bool on_touch_end_event (GdkEventTouch*); + bool on_touch_update_event (GdkEventTouch*); void color_handler ();