summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-10-13 22:41:17 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-10-14 09:54:38 -0400
commita244075fb31868a9108202763dbd304ddc853a75 (patch)
tree900cf0ce7df709ea3f3d58fda127f121da7471ae /gtk2_ardour
parent09c7c5fb950c94d0a4db1cc2f9f46d5690c751f9 (diff)
changes that will help fix a crash related to plugin window visibility. some work still to be done
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/plugin_ui.cc1
-rw-r--r--gtk2_ardour/processor_box.cc77
-rw-r--r--gtk2_ardour/processor_box.h12
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 *);