From bdf9dec41193b2cdfb27c0b067b883b58b2fd8f1 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 24 Jun 2025 19:17:47 -0600 Subject: [PATCH] pianoroll: if invisible, defer (expensive) ::set_region() till shown --- gtk2_ardour/pianoroll.cc | 16 +++++++++++++++- gtk2_ardour/pianoroll.h | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/pianoroll.cc b/gtk2_ardour/pianoroll.cc index 02dfe7dbe5..6d6a62c092 100644 --- a/gtk2_ardour/pianoroll.cc +++ b/gtk2_ardour/pianoroll.cc @@ -639,10 +639,19 @@ Pianoroll::build_canvas () _canvas->set_name ("MidiCueCanvas"); _canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK | Gdk::SCROLL_MASK | Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK); _canvas->set_can_focus (); - + _canvas->signal_show().connect (sigc::mem_fun (*this, &Pianoroll::catch_pending_show_region)); _toolbox.pack_start (*_canvas_viewport, true, true); } +void +Pianoroll::catch_pending_show_region () +{ + if (_visible_pending_region) { + set_region (_visible_pending_region); + _visible_pending_region.reset (); + } +} + bool Pianoroll::bbt_ruler_event (GdkEvent* ev) { @@ -2603,6 +2612,11 @@ Pianoroll::update_solo_display () void Pianoroll::set_region (std::shared_ptr r) { + if (!get_canvas()->is_visible()) { + _visible_pending_region = r; + return; + } + unset (false); if (!r) { diff --git a/gtk2_ardour/pianoroll.h b/gtk2_ardour/pianoroll.h index bfde56746e..da821fd75d 100644 --- a/gtk2_ardour/pianoroll.h +++ b/gtk2_ardour/pianoroll.h @@ -352,4 +352,7 @@ class Pianoroll : public CueEditor Gtk::Menu _region_context_menu; void popup_region_context_menu (ArdourCanvas::Item* item, GdkEvent* event); + + std::shared_ptr _visible_pending_region; + void catch_pending_show_region (); };