summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_routes.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-04-30 18:01:30 +0200
committerRobin Gareus <robin@gareus.org>2015-04-30 18:01:30 +0200
commite3375c309abbfc42baaedcc9ba7367e89314ab69 (patch)
treec1ec0ba902f481bb9fc71be02d91e848b2ed338d /gtk2_ardour/editor_routes.cc
parentae38128f88270df6ad24a0aa167adfc248276509 (diff)
suspend editor redisplay during batch changes
(major speed-up when changing all meters)
Diffstat (limited to 'gtk2_ardour/editor_routes.cc')
-rw-r--r--gtk2_ardour/editor_routes.cc17
1 files changed, 15 insertions, 2 deletions
diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc
index 327841f4ad..8ab17897d7 100644
--- a/gtk2_ardour/editor_routes.cc
+++ b/gtk2_ardour/editor_routes.cc
@@ -77,7 +77,8 @@ EditorRoutes::EditorRoutes (Editor* e)
, _menu (0)
, old_focus (0)
, selection_countdown (0)
- , name_editable (0)
+ , name_editable (0)
+ , _redisplay_on_resume (false)
{
static const int column_width = 22;
@@ -360,6 +361,13 @@ EditorRoutes::set_session (Session* s)
if (_session) {
_session->SoloChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::solo_changed_so_update_mute, this), gui_context());
_session->RecordStateChanged.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::update_rec_display, this), gui_context());
+
+ /* TODO: check if these needs to be tied in with DisplaySuspender
+ * Given that the UI is single-threaded and DisplaySuspender is only used
+ * in loops in the UI thread all should be fine.
+ */
+ _session->BatchUpdateStart.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::suspend_redisplay, this), gui_context());
+ _session->BatchUpdateEnd.connect (*this, MISSING_INVALIDATOR, boost::bind (&EditorRoutes::resume_redisplay, this), gui_context());
}
}
@@ -549,7 +557,12 @@ EditorRoutes::redisplay_real ()
void
EditorRoutes::redisplay ()
{
- if (_no_redisplay || !_session || _session->deletion_in_progress()) {
+ if (!_session || _session->deletion_in_progress()) {
+ return;
+ }
+
+ if (_no_redisplay) {
+ _redisplay_on_resume = true;
return;
}