summaryrefslogtreecommitdiff
path: root/gtk2_ardour/midi_region_view.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-04-20 23:48:39 +0000
committerCarl Hetherington <carl@carlh.net>2011-04-20 23:48:39 +0000
commite90e1cc771ac3c660e136db0cdc03e39524da895 (patch)
treeca33211e34c33828894a31535b9d445d800fd55d /gtk2_ardour/midi_region_view.cc
parent80e9eb09dd278d2b224d5da4c3fc82cca7c52182 (diff)
Prevent snap_frame_to_frame returning -ve offset from the region start (fixes #3925).
git-svn-id: svn://localhost/ardour2/branches/3.0@9396 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/midi_region_view.cc')
-rw-r--r--gtk2_ardour/midi_region_view.cc28
1 files changed, 22 insertions, 6 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index 9be06cb1b7..7b9bb4ae30 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -2238,14 +2238,30 @@ MidiRegionView::snap_pixel_to_frame(double x)
return frame - _region->position(); // convert back to region relative
}
-framepos_t
-MidiRegionView::snap_frame_to_frame(framepos_t x)
+/** Snap a frame offset within our region using the current snap settings.
+ * @param x Frame offset from this region's position.
+ * @return Snapped frame offset from this region's position.
+ */
+frameoffset_t
+MidiRegionView::snap_frame_to_frame (frameoffset_t x)
{
PublicEditor& editor = trackview.editor();
- // x is region relative, convert it to global absolute frames
- framepos_t frame = x + _region->position();
- editor.snap_to(frame);
- return frame - _region->position(); // convert back to region relative
+
+ /* x is region relative, convert it to global absolute frames */
+ framepos_t const session_frame = x + _region->position();
+
+ /* try a snap in either direction */
+ framepos_t frame = session_frame;
+ editor.snap_to (frame, 0);
+
+ /* if we went off the beginning of the region, snap forwards */
+ if (frame < _region->position ()) {
+ frame = session_frame;
+ editor.snap_to (frame, 1);
+ }
+
+ /* back to region relative */
+ return frame - _region->position();
}
double