[Summary] Fixed bug 45163: Trim range from right corner of timeline leads Tracks to crash

[Details] Crash was provoked because of an attempt to add commands to the session reversible command, but when autoscroll started and trim began with autoscroll the session reversible command was not created for for Trim Drag.
This commit is contained in:
GZharun 2015-01-23 14:46:23 +02:00 committed by Paul Davis
parent 21cb2d6ff9
commit 6976a78100
2 changed files with 10 additions and 2 deletions

View File

@ -219,6 +219,7 @@ Drag::Drag (Editor* e, ArdourCanvas::Item* i, bool trackview_only)
, _pointer_frame_offset (0)
, _trackview_only (trackview_only)
, _move_threshold_passed (false)
, _starting_point_passed (false)
, _was_double_click (false)
, _raw_grab_frame (0)
, _grab_frame (0)
@ -369,7 +370,7 @@ Drag::motion_handler (GdkEvent* event, bool from_autoscroll)
bool const old_move_threshold_passed = _move_threshold_passed;
if (!from_autoscroll && !_move_threshold_passed) {
if (!_move_threshold_passed) {
bool const xp = (::llabs (_drags->current_pointer_frame () - _raw_grab_frame) >= threshold.first);
bool const yp = (::fabs ((current_pointer_y () - _grab_y)) >= threshold.second);
@ -385,7 +386,13 @@ Drag::motion_handler (GdkEvent* event, bool from_autoscroll)
}
if (!_editor->autoscroll_active() || from_autoscroll) {
motion (event, _move_threshold_passed != old_move_threshold_passed);
bool first_move = (_move_threshold_passed != old_move_threshold_passed) ||
from_autoscroll;
motion (event, first_move && !_starting_point_passed);
_starting_point_passed = first_move;
_last_pointer_x = _drags->current_pointer_x ();
_last_pointer_y = current_pointer_y ();

View File

@ -233,6 +233,7 @@ protected:
private:
bool _trackview_only; ///< true if pointer y value should always be relative to the top of the trackview group
bool _move_threshold_passed; ///< true if the move threshold has been passed, otherwise false
bool _starting_point_passed; ///< true if we called move () with first_move flag, otherwise false
bool _was_double_click; ///< true if drag initiated by a double click event
double _grab_x; ///< trackview x of the grab start position
double _grab_y; ///< y of the grab start position, possibly adjusted if _trackview_only is true