From 0ec926668c49800e064bff857bc91ec6899a41a8 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 3 Jun 2024 17:52:42 -0600 Subject: [PATCH] refine track drag API to control whether cursor can change on button press --- gtk2_ardour/editor.cc | 19 +++++++++++++----- gtk2_ardour/editor.h | 2 +- gtk2_ardour/public_editor.h | 2 +- gtk2_ardour/time_axis_view.cc | 38 +++++++++++++++++------------------ 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 1495a3b42c..660e5d734a 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -7030,7 +7030,7 @@ Editor::default_time_domain () const } void -Editor::start_track_drag (TimeAxisView& tav, int y, Gtk::Widget& w) +Editor::start_track_drag (TimeAxisView& tav, int y, Gtk::Widget& w, bool can_change_cursor) { track_drag = new TrackDrag (dynamic_cast (&tav), *_session); DEBUG_TRACE (DEBUG::TrackDrag, string_compose ("start track drag with %1\n", track_drag)); @@ -7038,6 +7038,13 @@ Editor::start_track_drag (TimeAxisView& tav, int y, Gtk::Widget& w) int xo, yo; w.translate_coordinates (edit_controls_vbox, 0, y, xo, yo); + if (can_change_cursor) { + track_drag->drag_cursor = _cursors->move->gobj(); + track_drag->predrag_cursor = gdk_window_get_cursor (edit_controls_vbox.get_window()->gobj()); + gdk_window_set_cursor (edit_controls_vbox.get_toplevel()->get_window()->gobj(), track_drag->drag_cursor); + track_drag->have_predrag_cursor = true; + } + track_drag->bump_track = nullptr; track_drag->previous = yo; track_drag->start = yo; @@ -7061,10 +7068,12 @@ Editor::mid_track_drag (GdkEventMotion* ev, Gtk::Widget& w) set_selected_track (*track_drag->track, Selection::Set, false); } - track_drag->drag_cursor = _cursors->move->gobj(); - track_drag->predrag_cursor = gdk_window_get_cursor (edit_controls_vbox.get_window()->gobj()); - gdk_window_set_cursor (edit_controls_vbox.get_toplevel()->get_window()->gobj(), track_drag->drag_cursor); - track_drag->have_predrag_cursor = true; + if (!track_drag->have_predrag_cursor) { + track_drag->drag_cursor = _cursors->move->gobj(); + track_drag->predrag_cursor = gdk_window_get_cursor (edit_controls_vbox.get_window()->gobj()); + gdk_window_set_cursor (edit_controls_vbox.get_toplevel()->get_window()->gobj(), track_drag->drag_cursor); + track_drag->have_predrag_cursor = true; + } track_drag->first_move = false; } diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index ace3782ccd..52e2b22bb8 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1405,7 +1405,7 @@ private: void insert_patch_change (bool from_context); void fork_selected_regions (); void fork_regions_from_unselected (); - void start_track_drag (TimeAxisView&, int y, Gtk::Widget& w); + void start_track_drag (TimeAxisView&, int y, Gtk::Widget& w, bool can_change_cursor); void mid_track_drag (GdkEventMotion*, Gtk::Widget& e); void end_track_drag (); void maybe_move_tracks (); diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 54ec0573aa..028047ccac 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -596,7 +596,7 @@ public: virtual void set_tempo_curve_range (double& max, double& min) const = 0; - virtual void start_track_drag (TimeAxisView&, int y, Gtk::Widget&) = 0; + virtual void start_track_drag (TimeAxisView&, int y, Gtk::Widget&, bool can_change_cursor) = 0; virtual void mid_track_drag (GdkEventMotion*, Gtk::Widget&) = 0; virtual void end_track_drag () = 0; virtual bool track_dragging() const = 0; diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index 49a1d885dc..a7f066a53f 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -411,6 +411,19 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev) bool TimeAxisView::controls_ebox_button_press (GdkEventButton* event) { + bool inside_name_label = false; + + if (name_label.is_ancestor (controls_ebox)) { + int nlx; + int nly; + controls_ebox.translate_coordinates (name_label, event->x, event->y, nlx, nly); + Gtk::Allocation a = name_label.get_allocation (); + + if (nlx > 0 && nlx < a.get_width() && nly > 0 && nly < a.get_height()) { + inside_name_label = true; + } + } + /* double-click inside the name area */ if ((event->button == 1 && event->type == GDK_2BUTTON_PRESS) || Keyboard::is_edit_event (event)) { @@ -430,23 +443,12 @@ TimeAxisView::controls_ebox_button_press (GdkEventButton* event) _editor.end_track_drag (); - /* see if it is inside the name label */ + if (inside_name_label) { - - if (name_label.is_ancestor (controls_ebox)) { - - int nlx; - int nly; - controls_ebox.translate_coordinates (name_label, event->x, event->y, nlx, nly); - Gtk::Allocation a = name_label.get_allocation (); - - if (nlx > 0 && nlx < a.get_width() && nly > 0 && nly < a.get_height()) { - - if ((event->type == GDK_2BUTTON_PRESS) || Keyboard::is_edit_event (event)) { - begin_name_edit (); - _ebox_release_can_act = false; - return true; - } + if ((event->type == GDK_2BUTTON_PRESS) || Keyboard::is_edit_event (event)) { + begin_name_edit (); + _ebox_release_can_act = false; + return true; } } } @@ -464,11 +466,9 @@ TimeAxisView::controls_ebox_button_press (GdkEventButton* event) _ebox_release_can_act = true; if (maybe_set_cursor (event->y) > 0) { - _resize_drag_start = event->y_root; - } else if (event->button == 1 && event->type == GDK_BUTTON_PRESS) { - _editor.start_track_drag (*this, event->y, controls_ebox); + _editor.start_track_drag (*this, event->y, controls_ebox, !inside_name_label); } return true;