changes that will help fix a crash related to plugin window visibility. some work still to be done
This commit is contained in:
parent
09c7c5fb95
commit
a244075fb3
@ -161,6 +161,7 @@ PluginUIWindow::PluginUIWindow (
|
||||
|
||||
PluginUIWindow::~PluginUIWindow ()
|
||||
{
|
||||
cerr << "PluginWindow deleted for " << this << endl;
|
||||
delete _pluginui;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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 *);
|
||||
|
Loading…
Reference in New Issue
Block a user