diff options
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/plugin_ui.cc | 1 | ||||
-rw-r--r-- | gtk2_ardour/processor_box.cc | 77 | ||||
-rw-r--r-- | gtk2_ardour/processor_box.h | 12 |
3 files changed, 83 insertions, 7 deletions
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<ProcessorWindowProxy*>::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<ProcessorWindowProxy*>::iterator i = _processor_window_info.begin(); + ProcessorWindowProxies::iterator i = _processor_window_info.begin(); while (i != _processor_window_info.end()) { - list<ProcessorWindowProxy*>::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<Processor> w) return; } - list<ProcessorWindowProxy*>::iterator i = _processor_window_info.begin (); + ProcessorWindowProxies::iterator i = _processor_window_info.begin (); while (i != _processor_window_info.end()) { boost::shared_ptr<Processor> 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> 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<Processor> 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<ARDOUR::Processor>); + ~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<ARDOUR::Processor> _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<ProcessorEntry> 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<ARDOUR::PluginInsert> pi); - std::list<ProcessorWindowProxy*> _processor_window_info; + typedef std::list<ProcessorWindowProxy*> ProcessorWindowProxies; + ProcessorWindowProxies _processor_window_info; + ProcessorWindowProxy* find_window_proxy (boost::shared_ptr<ARDOUR::Processor>) const; void set_processor_ui (boost::shared_ptr<ARDOUR::Processor>, Gtk::Window *); |