From a90858897ec9bf3bb3b8300119de70ed59f02227 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 12 Oct 2013 16:44:50 -0400 Subject: do not use delete_when_idle() to delete a plugin UI because an entirely separate mechanism exists for that --- gtk2_ardour/plugin_ui.cc | 2 -- 1 file changed, 2 deletions(-) (limited to 'gtk2_ardour/plugin_ui.cc') diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index 713b98cdaf..86028794d9 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -405,8 +405,6 @@ PluginUIWindow::plugin_going_away () } death_connection.disconnect (); - - delete_when_idle (this); } PlugUIBase::PlugUIBase (boost::shared_ptr pi) -- cgit v1.2.3 From a244075fb31868a9108202763dbd304ddc853a75 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 13 Oct 2013 22:41:17 -0400 Subject: changes that will help fix a crash related to plugin window visibility. some work still to be done --- gtk2_ardour/plugin_ui.cc | 1 + gtk2_ardour/processor_box.cc | 77 ++++++++++++++++++++++++++++++++++++++++---- gtk2_ardour/processor_box.h | 12 ++++++- 3 files changed, 83 insertions(+), 7 deletions(-) (limited to 'gtk2_ardour/plugin_ui.cc') diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc index 86028794d9..3f523a82d2 100644 --- a/gtk2_ardour/plugin_ui.cc +++ b/gtk2_ardour/plugin_ui.cc @@ -161,6 +161,7 @@ PluginUIWindow::PluginUIWindow ( PluginUIWindow::~PluginUIWindow () { + cerr << "PluginWindow deleted for " << this << endl; delete _pluginui; } diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 17f548c0e3..0585d3792d 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -1392,7 +1392,7 @@ ProcessorBox::redisplay_processors () _route->foreach_processor (sigc::mem_fun (*this, &ProcessorBox::add_processor_to_display)); - for (list::iterator i = _processor_window_info.begin(); i != _processor_window_info.end(); ++i) { + for (ProcessorWindowProxies::iterator i = _processor_window_info.begin(); i != _processor_window_info.end(); ++i) { (*i)->marked = false; } @@ -1400,16 +1400,43 @@ ProcessorBox::redisplay_processors () /* trim dead wood from the processor window proxy list */ - list::iterator i = _processor_window_info.begin(); + ProcessorWindowProxies::iterator i = _processor_window_info.begin(); while (i != _processor_window_info.end()) { - list::iterator j = i; + ProcessorWindowProxies::iterator j = i; ++j; - if (!(*i)->marked) { + if (!(*i)->valid()) { + WM::Manager::instance().remove (*i); delete *i; _processor_window_info.erase (i); - } + + } else if (!(*i)->marked) { + + /* this processor is no longer part of this processor + * box. + * + * that could be because it was deleted or it could be + * because the route being displayed in the parent + * strip changed. + * + * The latter only happens with the editor mixer strip. + */ + + if (is_editor_mixer_strip()) { + + /* editor mixer strip .. DO NOTHING + * + * note: the processor window stays visible if + * it is already visible + */ + } else { + (*i)->hide (); + WM::Manager::instance().remove (*i); + delete *i; + _processor_window_info.erase (i); + } + } i = j; } @@ -1428,7 +1455,7 @@ ProcessorBox::maybe_add_processor_to_ui_list (boost::weak_ptr w) return; } - list::iterator i = _processor_window_info.begin (); + ProcessorWindowProxies::iterator i = _processor_window_info.begin (); while (i != _processor_window_info.end()) { boost::shared_ptr t = (*i)->processor().lock (); @@ -2667,6 +2694,12 @@ ProcessorBox::update_gui_object_state (ProcessorEntry* entry) entry->add_control_state (proc); } +bool +ProcessorBox::is_editor_mixer_strip() const +{ + return _parent_strip && !_parent_strip->mixer_owned(); +} + ProcessorWindowProxy::ProcessorWindowProxy (string const & name, ProcessorBox* box, boost::weak_ptr processor) : WM::ProxyBase (name, string()) , marked (false) @@ -2674,8 +2707,34 @@ ProcessorWindowProxy::ProcessorWindowProxy (string const & name, ProcessorBox* b , _processor (processor) , is_custom (false) , want_custom (false) + , _valid (true) +{ + boost::shared_ptr p = _processor.lock (); + if (!p) { + return; + } + p->DropReferences.connect (going_away_connection, MISSING_INVALIDATOR, boost::bind (&ProcessorWindowProxy::processor_going_away, this), gui_context()); +} + +ProcessorWindowProxy::~ProcessorWindowProxy() { + /* processor window proxies do not own the windows they create with + * ::get(), so set _window to null before the normal WindowProxy method + * deletes it. + */ + _window = 0; +} +void +ProcessorWindowProxy::processor_going_away () +{ + delete _window; + _window = 0; + _valid = false; + /* should be no real reason to do this, since the object that would + send DropReferences is about to be deleted, but lets do it anyway. + */ + going_away_connection.disconnect(); } ARDOUR::SessionHandlePtr* @@ -2685,6 +2744,12 @@ ProcessorWindowProxy::session_handle() return 0; } +bool +ProcessorWindowProxy::valid() const +{ + return _valid; +} + XMLNode& ProcessorWindowProxy::get_state () const { diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h index a72eb3223d..41bc68281f 100644 --- a/gtk2_ardour/processor_box.h +++ b/gtk2_ardour/processor_box.h @@ -79,6 +79,7 @@ class ProcessorWindowProxy : public WM::ProxyBase { public: ProcessorWindowProxy (std::string const &, ProcessorBox *, boost::weak_ptr); + ~ProcessorWindowProxy(); Gtk::Window* get (bool create = false); @@ -91,6 +92,7 @@ class ProcessorWindowProxy : public WM::ProxyBase void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; } bool marked; + bool valid () const; void set_state (const XMLNode&); XMLNode& get_state () const; @@ -100,6 +102,10 @@ class ProcessorWindowProxy : public WM::ProxyBase boost::weak_ptr _processor; bool is_custom; bool want_custom; + bool _valid; + + void processor_going_away (); + PBD::ScopedConnection going_away_connection; }; class ProcessorEntry : public Gtkmm2ext::DnDVBoxChild, public sigc::trackable @@ -303,6 +309,8 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD void route_going_away (); + bool is_editor_mixer_strip() const; + Gtkmm2ext::DnDVBox processor_display; Gtk::ScrolledWindow processor_scroller; @@ -404,7 +412,9 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD void route_property_changed (const PBD::PropertyChange&); std::string generate_processor_title (boost::shared_ptr pi); - std::list _processor_window_info; + typedef std::list ProcessorWindowProxies; + ProcessorWindowProxies _processor_window_info; + ProcessorWindowProxy* find_window_proxy (boost::shared_ptr) const; void set_processor_ui (boost::shared_ptr, Gtk::Window *); -- cgit v1.2.3