summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-02-03 00:52:45 +0000
committerCarl Hetherington <carl@carlh.net>2010-02-03 00:52:45 +0000
commitc3bfc3ec4e14d147d9c4c279eb6c73947781f956 (patch)
tree250b7e09a3552419249c317eec5258d08fe801ba /gtk2_ardour
parentfaa2b3a3ad9217b0bde341f50a398515aefd703a (diff)
Stop crash on deleting a plugin when its generic UI window is open.
git-svn-id: svn://localhost/ardour2/branches/3.0@6626 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/automation_controller.cc6
-rw-r--r--gtk2_ardour/automation_controller.h4
-rw-r--r--gtk2_ardour/generic_pluginui.cc12
-rw-r--r--gtk2_ardour/plugin_ui.cc2
-rw-r--r--gtk2_ardour/plugin_ui.h1
5 files changed, 21 insertions, 4 deletions
diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc
index 1a32c36b62..0d16628ab0 100644
--- a/gtk2_ardour/automation_controller.cc
+++ b/gtk2_ardour/automation_controller.cc
@@ -150,3 +150,9 @@ AutomationController::value_changed ()
Gtkmm2ext::UI::instance()->call_slot (boost::bind (&AutomationController::display_effective_value, this));
}
+/** Stop updating our value from our controllable */
+void
+AutomationController::stop_updating ()
+{
+ _screen_update_connection.disconnect ();
+}
diff --git a/gtk2_ardour/automation_controller.h b/gtk2_ardour/automation_controller.h
index e6d377ab26..a2168700e2 100644
--- a/gtk2_ardour/automation_controller.h
+++ b/gtk2_ardour/automation_controller.h
@@ -34,7 +34,7 @@ namespace ARDOUR {
class Automatable;
}
-
+/** A BarController which displays the value and allows control of an AutomationControl */
class AutomationController : public Gtkmm2ext::BarController {
public:
static boost::shared_ptr<AutomationController> create(
@@ -51,6 +51,8 @@ public:
void display_effective_value();
void value_adjusted();
+ void stop_updating ();
+
private:
AutomationController (boost::shared_ptr<ARDOUR::AutomationControl> ac, Gtk::Adjustment* adj);
std::string get_label (int&);
diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc
index 3d59910ff4..974d16887c 100644
--- a/gtk2_ardour/generic_pluginui.cc
+++ b/gtk2_ardour/generic_pluginui.cc
@@ -381,9 +381,10 @@ GenericPluginUI::print_parameter (char *buf, uint32_t len, uint32_t param)
GenericPluginUI::ControlUI*
GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<AutomationControl> mcontrol)
{
- ControlUI* control_ui = NULL;
- if (!mcontrol)
+ ControlUI* control_ui = 0;
+ if (!mcontrol) {
return control_ui;
+ }
Plugin::ParameterDescriptor desc;
@@ -545,6 +546,8 @@ GenericPluginUI::build_control_ui (guint32 port_index, boost::shared_ptr<Automat
mcontrol->Changed.connect (control_connections, boost::bind (&GenericPluginUI::parameter_changed, this, control_ui), gui_context());
mcontrol->alist()->automation_state_changed.connect (control_connections, boost::bind (&GenericPluginUI::automation_state_changed, this, control_ui), gui_context());
+ input_controls.push_back (control_ui);
+
} else if (plugin->parameter_is_output (port_index)) {
control_ui->display = manage (new EventBox);
@@ -749,9 +752,14 @@ GenericPluginUI::start_updating (GdkEventAny*)
bool
GenericPluginUI::stop_updating (GdkEventAny*)
{
+ for (vector<ControlUI*>::iterator i = input_controls.begin(); i != input_controls.end(); ++i) {
+ (*i)->controller->stop_updating ();
+ }
+
if (output_controls.size() > 0 ) {
screen_update_connection.disconnect();
}
+
return false;
}
diff --git a/gtk2_ardour/plugin_ui.cc b/gtk2_ardour/plugin_ui.cc
index 1273682083..1c7ce5d9e6 100644
--- a/gtk2_ardour/plugin_ui.cc
+++ b/gtk2_ardour/plugin_ui.cc
@@ -120,7 +120,7 @@ PluginUIWindow::PluginUIWindow (Gtk::Window* win, boost::shared_ptr<PluginInsert
GenericPluginUI* pu = new GenericPluginUI (insert, scrollable);
_pluginui = pu;
- add( *pu );
+ add (*pu);
/*
Gtk::HBox *hbox = new Gtk::HBox();
diff --git a/gtk2_ardour/plugin_ui.h b/gtk2_ardour/plugin_ui.h
index d1ea82f830..efef275eaa 100644
--- a/gtk2_ardour/plugin_ui.h
+++ b/gtk2_ardour/plugin_ui.h
@@ -214,6 +214,7 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
~ControlUI();
};
+ std::vector<ControlUI*> input_controls;
std::vector<ControlUI*> output_controls;
sigc::connection screen_update_connection;
void output_update();