diff --git a/src/core/TimePos.cpp b/src/core/TimePos.cpp index 9d25b9ce136..4a22a1eb999 100644 --- a/src/core/TimePos.cpp +++ b/src/core/TimePos.cpp @@ -72,7 +72,12 @@ TimePos TimePos::quantize(float bars) const //Offset from the lower position int offset = m_ticks % interval; //1 if we should snap up, 0 if we shouldn't - int snapUp = offset / (interval / 2); + // Ternary expression is making sure that the snap happens in the direction to + // the right even if m_ticks is negative and the offset is exactly half-way + // More details on issue #5840 and PR #5847 + int snapUp = ((2 * offset) == -interval) + ? 0 + : (2 * offset) / interval; return (lowPos + snapUp) * interval; } diff --git a/src/gui/widgets/TrackContentWidget.cpp b/src/gui/widgets/TrackContentWidget.cpp index 5dd237948e9..11ac3a60f0b 100644 --- a/src/gui/widgets/TrackContentWidget.cpp +++ b/src/gui/widgets/TrackContentWidget.cpp @@ -477,7 +477,7 @@ bool TrackContentWidget::pasteSelection( TimePos tcoPos, const QMimeData * md, b // All patterns should be offset the same amount as the grabbed pattern TimePos offset = TimePos(tcoPos - grabbedTCOPos); // Users expect clips to "fall" backwards, so bias the offset - offset = offset - TimePos::ticksPerBar() * snapSize / 2; + offset -= TimePos::ticksPerBar() * snapSize / 2; // The offset is quantized (rather than the positions) to preserve fine adjustments offset = offset.quantize(snapSize);