summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2011-12-13 19:43:41 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2011-12-13 19:43:41 +0000
commitb6d1fb0707dbc80e9f05dfcb2458e8e7e6f1c6e3 (patch)
tree8d5a9f319e0531430d25f3a27fd60e6657c6106f /gtk2_ardour
parent88d49cdb5734632ada27d2de018533ecd13ac31e (diff)
fix meter marker drags by not using a fake marker till first move, and swapping the grabbed item to the copy when we do
git-svn-id: svn://localhost/ardour2/branches/3.0@10999 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/editor_drag.cc69
1 files changed, 35 insertions, 34 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc
index 20ebe7f98d..3847d144d3 100644
--- a/gtk2_ardour/editor_drag.cc
+++ b/gtk2_ardour/editor_drag.cc
@@ -1845,7 +1845,6 @@ MeterMarkerDrag::MeterMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c)
_copy (c)
{
DEBUG_TRACE (DEBUG::Drags, "New MeterMarkerDrag\n");
-
_marker = reinterpret_cast<MeterMarker*> (_item->get_data ("marker"));
assert (_marker);
}
@@ -1853,36 +1852,6 @@ MeterMarkerDrag::MeterMarkerDrag (Editor* e, ArdourCanvas::Item* i, bool c)
void
MeterMarkerDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
{
- // create a dummy marker for visual representation of moving the
- // section, because whether its a copy or not, we're going to
- // leave or lose the original marker (leave if its a copy; lose if its
- // not, because we'll remove it from the map).
-
- MeterSection section (_marker->meter());
-
- if (!section.movable()) {
- return;
- }
-
- char name[64];
- snprintf (name, sizeof(name), "%g/%g", _marker->meter().divisions_per_bar(), _marker->meter().note_divisor ());
-
- _marker = new MeterMarker (
- *_editor,
- *_editor->meter_group,
- ARDOUR_UI::config()->canvasvar_MeterMarker.get(),
- name,
- *new MeterSection (_marker->meter())
- );
-
- _item = &_marker->the_item ();
-
- if (!_copy) {
- TempoMap& map (_editor->session()->tempo_map());
- /* remove the section while we drag it */
- map.remove_meter (section);
- }
-
Drag::start_grab (event, cursor);
show_verbose_cursor_time (adjusted_current_frame(event));
}
@@ -1894,12 +1863,44 @@ MeterMarkerDrag::setup_pointer_frame_offset ()
}
void
-MeterMarkerDrag::motion (GdkEvent* event, bool)
+MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
{
- framepos_t const pf = adjusted_current_frame (event);
+ if (first_move) {
- _marker->set_position (pf);
+ // create a dummy marker for visual representation of moving the
+ // section, because whether its a copy or not, we're going to
+ // leave or lose the original marker (leave if its a copy; lose if its
+ // not, because we'll remove it from the map).
+
+ MeterSection section (_marker->meter());
+
+ if (!section.movable()) {
+ return;
+ }
+
+ char name[64];
+ snprintf (name, sizeof(name), "%g/%g", _marker->meter().divisions_per_bar(), _marker->meter().note_divisor ());
+
+ _marker = new MeterMarker (
+ *_editor,
+ *_editor->meter_group,
+ ARDOUR_UI::config()->canvasvar_MeterMarker.get(),
+ name,
+ *new MeterSection (_marker->meter())
+ );
+
+ /* use the new marker for the grab */
+ swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME);
+ if (!_copy) {
+ TempoMap& map (_editor->session()->tempo_map());
+ /* remove the section while we drag it */
+ map.remove_meter (section);
+ }
+ }
+
+ framepos_t const pf = adjusted_current_frame (event);
+ _marker->set_position (pf);
show_verbose_cursor_time (pf);
}