From 8ee0671fd9224453a2b8afc3d467bdb22872bd80 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 26 Jun 2013 11:49:16 -0400 Subject: [PATCH] probable fix for a region drag that somehow ends up with no time axis view (track) under the mouse (e.g. during a track height reduction --- gtk2_ardour/editor_drag.cc | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 020953211f..c252255bb8 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -519,9 +519,11 @@ RegionDrag::find_time_axis_view (TimeAxisView* t) const } RegionMotionDrag::RegionMotionDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list const & v, bool b) - : RegionDrag (e, i, p, v), - _brushing (b), - _total_x_delta (0) + : RegionDrag (e, i, p, v) + , _brushing (b) + , _total_x_delta (0) + , _last_pointer_time_axis_view (0) + , _last_pointer_layer (0) { DEBUG_TRACE (DEBUG::Drags, "New RegionMotionDrag\n"); } @@ -534,8 +536,10 @@ RegionMotionDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor) show_verbose_cursor_time (_last_frame_position); pair const tv = _editor->trackview_by_y_position (_drags->current_pointer_y ()); - _last_pointer_time_axis_view = find_time_axis_view (tv.first); - _last_pointer_layer = tv.first->layer_display() == Overlaid ? 0 : tv.second; + if (tv.first) { + _last_pointer_time_axis_view = find_time_axis_view (tv.first); + _last_pointer_layer = tv.first->layer_display() == Overlaid ? 0 : tv.second; + } } double @@ -642,17 +646,18 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move) /* Find the TimeAxisView that the pointer is now over */ pair const tv = _editor->trackview_by_y_position (_drags->current_pointer_y ()); - if (first_move && tv.first->view()->layer_display() == Stacked) { - tv.first->view()->set_layer_display (Expanded); - } - /* Bail early if we're not over a track */ RouteTimeAxisView* rtv = dynamic_cast (tv.first); + if (!rtv || !rtv->is_track()) { _editor->verbose_cursor()->hide (); return; } + if (first_move && tv.first->view()->layer_display() == Stacked) { + tv.first->view()->set_layer_display (Expanded); + } + /* Note: time axis views in this method are often expressed as an index into the _time_axis_views vector */ /* Here's the current pointer position in terms of time axis view and layer */