summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_canvas.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2006-09-19 03:29:16 +0000
committerDavid Robillard <d@drobilla.net>2006-09-19 03:29:16 +0000
commit7bd41538d951c3e476655df741adfbebbb990bde (patch)
treef9988f959571c75535341ab1de463b7cfc5209e3 /gtk2_ardour/editor_canvas.cc
parentc7307c09b8584b15610f0b29a40f839d9183419a (diff)
Merged with trunk R920.
git-svn-id: svn://localhost/ardour2/branches/midi@921 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_canvas.cc')
-rw-r--r--gtk2_ardour/editor_canvas.cc56
1 files changed, 31 insertions, 25 deletions
diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc
index d8eebf1c4b..e2e04326ca 100644
--- a/gtk2_ardour/editor_canvas.cc
+++ b/gtk2_ardour/editor_canvas.cc
@@ -266,14 +266,15 @@ Editor::initialize_canvas ()
edit_cursor = new Cursor (*this, "blue", &Editor::canvas_edit_cursor_event);
playhead_cursor = new Cursor (*this, "red", &Editor::canvas_playhead_cursor_event);
-
+
+ initial_ruler_update_required = true;
track_canvas.signal_size_allocate().connect (mem_fun(*this, &Editor::track_canvas_allocate));
+
}
void
Editor::track_canvas_allocate (Gtk::Allocation alloc)
{
- static bool first_time = true;
canvas_width = alloc.get_width();
canvas_height = alloc.get_height();
@@ -318,14 +319,16 @@ Editor::track_canvas_allocate (Gtk::Allocation alloc)
transport_punchout_line->property_y2() = canvas_height;
}
- update_fixed_rulers ();
-
- if (is_visible() && first_time) {
+ if (is_visible() && initial_ruler_update_required) {
+ /*
+ this is really dumb, but signal_size_allocate() gets emitted intermittently
+ depending on whether the canvas contents are visible or not.
+ we only want to do this once
+ */
+ update_fixed_rulers();
tempo_map_changed (Change (0));
- first_time = false;
- } else {
- redisplay_tempo ();
- }
+ initial_ruler_update_required = false;
+ }
Resized (); /* EMIT_SIGNAL */
}
@@ -414,6 +417,8 @@ Editor::track_canvas_drag_data_received (const RefPtr<Gdk::DragContext>& context
const SelectionData& data,
guint info, guint time)
{
+ cerr << "dropping, target = " << data.get_target() << endl;
+
if (data.get_target() == "regions") {
drop_regions (context, x, y, data, info, time);
} else {
@@ -528,7 +533,7 @@ Editor::maybe_autoscroll (GdkEvent* event)
}
- if (autoscroll_direction != last_autoscroll_direction) {
+ if ((autoscroll_direction != last_autoscroll_direction) || (leftmost_frame < frame < rightmost_frame)) {
stop_canvas_autoscroll ();
}
@@ -542,14 +547,13 @@ Editor::maybe_autoscroll (GdkEvent* event)
gint
Editor::_autoscroll_canvas (void *arg)
{
- return ((Editor *) arg)->autoscroll_canvas ();
+ return ((Editor *) arg)->autoscroll_canvas ();
}
-gint
+bool
Editor::autoscroll_canvas ()
{
jack_nframes_t new_frame;
- bool keep_calling = true;
jack_nframes_t limit = max_frames - current_page_frames();
GdkEventMotion ev;
jack_nframes_t target_frame;
@@ -570,10 +574,6 @@ Editor::autoscroll_canvas ()
target_frame = drag_info.current_pointer_frame + autoscroll_distance;
}
- if (new_frame != leftmost_frame) {
- reposition_x_origin (new_frame);
- }
-
/* now fake a motion event to get the object that is being dragged to move too */
ev.type = GDK_MOTION_NOTIFY;
@@ -593,20 +593,26 @@ Editor::autoscroll_canvas ()
/* connect the timeout so that we get called repeatedly */
- autoscroll_timeout_tag = g_timeout_add (20, _autoscroll_canvas, this);
- keep_calling = false;
+ autoscroll_timeout_tag = g_idle_add ( _autoscroll_canvas, this);
+ return false;
+
+ }
- } else if (autoscroll_cnt == 50) { /* 0.5 seconds */
+ if (new_frame != leftmost_frame) {
+ reposition_x_origin (new_frame);
+ }
+
+ if (autoscroll_cnt == 50) { /* 0.5 seconds */
/* after about a while, speed up a bit by changing the timeout interval */
- autoscroll_distance = (jack_nframes_t) floor (current_page_frames()/50.0f);
+ autoscroll_distance = (jack_nframes_t) floor (current_page_frames()/30.0f);
- } else if (autoscroll_cnt == 75) { /* 1.0 seconds */
+ } else if (autoscroll_cnt == 150) { /* 1.0 seconds */
autoscroll_distance = (jack_nframes_t) floor (current_page_frames()/20.0f);
- } else if (autoscroll_cnt == 100) { /* 1.5 seconds */
+ } else if (autoscroll_cnt == 300) { /* 1.5 seconds */
/* after about another while, speed up by increasing the shift per callback */
@@ -614,7 +620,7 @@ Editor::autoscroll_canvas ()
}
- return keep_calling;
+ return true;
}
void
@@ -631,7 +637,7 @@ Editor::start_canvas_autoscroll (int dir)
autoscroll_cnt = 0;
/* do it right now, which will start the repeated callbacks */
-
+
autoscroll_canvas ();
}