, _full_canvas_height (0)
, edit_controls_left_menu (0)
, edit_controls_right_menu (0)
+ , visual_change_queued(false)
, _last_update_time (0)
, _err_screen_engine (0)
, cut_buffer_start (0)
return static_cast<Editor*>(arg)->idle_visual_changer ();
}
+void
+Editor::pre_render ()
+{
+ visual_change_queued = false;
+
+ if (pending_visual_change.pending != 0) {
+ ensure_visual_change_idle_handler();
+ }
+}
+
int
Editor::idle_visual_changer ()
{
+ if (pending_visual_change.pending == 0) {
+ return 0;
+ }
+
/* set_horizontal_position() below (and maybe other calls) call
gtk_main_iteration(), so it's possible that a signal will be handled
half-way through this method. If this signal wants an
*/
pending_visual_change.idle_handler_id = -1;
+
+ if (visual_change_queued) {
+ return 0;
+ }
+
pending_visual_change.being_handled = true;
VisualChange vc = pending_visual_change;
pending_visual_change.being_handled = false;
+ visual_change_queued = true;
+
return 0; /* this is always a one-shot call */
}
};
VisualChange pending_visual_change;
+ bool visual_change_queued;
+
+ void pre_render ();
static int _idle_visual_changer (void *arg);
int idle_visual_changer ();
_track_canvas->signal_enter_notify_event().connect (sigc::mem_fun(*this, &Editor::entered_track_canvas), false);
_track_canvas->set_flags (CAN_FOCUS);
+ _track_canvas->PreRender.connect (sigc::mem_fun(*this, &Editor::pre_render));
+
/* set up drag-n-drop */
vector<TargetEntry> target_table;