diff --git a/gtk2_ardour/automation_line.cc b/gtk2_ardour/automation_line.cc index b435ead368..a469888119 100644 --- a/gtk2_ardour/automation_line.cc +++ b/gtk2_ardour/automation_line.cc @@ -539,8 +539,13 @@ AutomationLine::ContiguousControlPoints::clamp_dx (double dx) } tx = cp->get_x() + dx; // new possible position if we just add the motion + + tx = max (tx, 0.); + tx = min (tx, region_limit); + tx = max (tx, before_x); // can't move later than following point tx = min (tx, after_x); // can't move earlier than preceding point + return tx - cp->get_x (); } @@ -637,8 +642,10 @@ AutomationLine::drag_motion (double const x, float fraction, bool ignore_x, bool */ if (dx < 0 || ((dx > 0) && !with_push)) { - for (vector::iterator ccp = contiguous_points.begin(); ccp != contiguous_points.end(); ++ccp) { - dx = (*ccp)->clamp_dx (dx); + const timepos_t rl (maximum_time() + _offset); + double region_limit = trackview.editor().duration_to_pixels_unrounded (timecnt_t (rl, get_origin())); + for (auto const & ccp : contiguous_points){ + dx = ccp->clamp_dx (dx, region_limit); } } diff --git a/gtk2_ardour/automation_line.h b/gtk2_ardour/automation_line.h index fac5ce5562..492dd1a954 100644 --- a/gtk2_ardour/automation_line.h +++ b/gtk2_ardour/automation_line.h @@ -194,7 +194,7 @@ protected: class ContiguousControlPoints : public std::list { public: ContiguousControlPoints (AutomationLine& al); - double clamp_dx (double dx); + double clamp_dx (double dx, double region_limit); void move (double dx, double dvalue); void compute_x_bounds (PublicEditor& e); private: diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 7b11aaa219..e823f9e69a 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -4775,6 +4775,7 @@ ControlPointDrag::motion (GdkEvent* event, bool first_motion) cy = zero_gain_y; } + /* cx_pos is in absolute timeline units */ timepos_t cx_pos (timepos_t (pixel_to_time (cx)) + snap_delta (event->button.state)); if (need_snap) { @@ -4782,7 +4783,9 @@ ControlPointDrag::motion (GdkEvent* event, bool first_motion) } cx_pos.shift_earlier (snap_delta (event->button.state)); - cx_pos = min (cx_pos, _point->line().maximum_time() + _point->line().offset()); + + /* total number of pixels (canvas window units) to move */ + double px = _editor->time_to_pixel_unrounded (cx_pos); float const fraction = 1.0 - (cy / _point->line().height()); @@ -4791,8 +4794,9 @@ ControlPointDrag::motion (GdkEvent* event, bool first_motion) _editor->begin_reversible_command (_("automation event move")); _point->line().start_drag_single (_point, _fixed_grab_x, initial_fraction); } + pair result; - result = _point->line().drag_motion (_editor->time_to_pixel_unrounded (cx_pos), fraction, false, _pushing, _final_index); + result = _point->line().drag_motion (px, fraction, false, _pushing, _final_index); show_verbose_cursor_text (_point->line().get_verbose_cursor_relative_string (result.first, result.second)); }