summaryrefslogtreecommitdiff
path: root/gtk2_ardour/lv2_plugin_ui.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/lv2_plugin_ui.cc')
-rw-r--r--gtk2_ardour/lv2_plugin_ui.cc73
1 files changed, 54 insertions, 19 deletions
diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc
index f9b15714f6..c273c1f4dd 100644
--- a/gtk2_ardour/lv2_plugin_ui.cc
+++ b/gtk2_ardour/lv2_plugin_ui.cc
@@ -113,6 +113,7 @@ LV2PluginUI::update_timeout()
void
LV2PluginUI::on_external_ui_closed(void* controller)
{
+ //printf("LV2PluginUI::on_external_ui_closed\n");
LV2PluginUI* me = (LV2PluginUI*)controller;
me->_screen_update_connection.disconnect();
me->_external_ui_ptr = NULL;
@@ -167,6 +168,19 @@ LV2PluginUI::output_update()
//cout << "output_update" << endl;
if (_external_ui_ptr) {
LV2_EXTERNAL_UI_RUN(_external_ui_ptr);
+ if (_lv2->is_external_kx() && !_external_ui_ptr) {
+ // clean up external UI if it closes itself via
+ // on_external_ui_closed() during run()
+ //printf("LV2PluginUI::output_update -- UI was closed\n");
+ //_screen_update_connection.disconnect();
+ _message_update_connection.disconnect();
+ if (_inst) {
+ suil_instance_free((SuilInstance*)_inst);
+ }
+ _inst = NULL;
+ _external_ui_ptr = NULL;
+ return;
+ }
}
/* FIXME only works with control output ports (which is all we support now anyway) */
@@ -218,12 +232,16 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
_external_ui_feature.URI = LV2_EXTERNAL_UI_URI;
_external_ui_feature.data = &_external_ui_host;
+ _external_kxui_feature.URI = LV2_EXTERNAL_UI_KX__Host;
+ _external_kxui_feature.data = &_external_ui_host;
+
++features_count;
features = (LV2_Feature**)malloc(
- sizeof(LV2_Feature*) * (features_count + 1));
- for (size_t i = 0; i < features_count - 1; ++i) {
+ sizeof(LV2_Feature*) * (features_count + 2));
+ for (size_t i = 0; i < features_count - 2; ++i) {
features[i] = features_src[i];
}
+ features[features_count - 2] = &_external_kxui_feature;
features[features_count - 1] = &_external_ui_feature;
features[features_count] = NULL;
} else {
@@ -260,6 +278,10 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
? NS_UI "external"
: NS_UI "GtkUI";
+ if (_lv2->has_message_output()) {
+ _lv2->enable_ui_emmission();
+ }
+
const LilvUI* ui = (const LilvUI*)_lv2->c_ui();
_inst = suil_instance_new(
ui_host,
@@ -322,8 +344,7 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
}
if (_lv2->has_message_output()) {
- _lv2->enable_ui_emmission();
- ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect(
+ _message_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect(
sigc::mem_fun(*this, &LV2PluginUI::update_timeout));
}
}
@@ -350,17 +371,14 @@ LV2PluginUI::~LV2PluginUI ()
delete[] _values;
}
- /* Close and delete GUI. */
- lv2ui_free();
-
+ _message_update_connection.disconnect();
_screen_update_connection.disconnect();
- if (_lv2->is_external_ui()) {
- /* External UI is no longer valid.
- on_window_hide() will not try to use it if is NULL.
- */
- _external_ui_ptr = NULL;
+ if (_external_ui_ptr && _lv2->is_external_kx()) {
+ LV2_EXTERNAL_UI_HIDE(_external_ui_ptr);
}
+ lv2ui_free();
+ _external_ui_ptr = NULL;
}
int
@@ -423,7 +441,15 @@ LV2PluginUI::on_window_show(const std::string& title)
if (_lv2->is_external_ui()) {
if (_external_ui_ptr) {
+ _screen_update_connection.disconnect();
+ _message_update_connection.disconnect();
LV2_EXTERNAL_UI_SHOW(_external_ui_ptr);
+ _screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
+ (sigc::mem_fun(*this, &LV2PluginUI::output_update));
+ if (_lv2->has_message_output()) {
+ _message_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect(
+ sigc::mem_fun(*this, &LV2PluginUI::update_timeout));
+ }
return false;
}
lv2ui_instantiate(title);
@@ -431,10 +457,15 @@ LV2PluginUI::on_window_show(const std::string& title)
return false;
}
- LV2_EXTERNAL_UI_SHOW(_external_ui_ptr);
_screen_update_connection.disconnect();
+ _message_update_connection.disconnect();
+ LV2_EXTERNAL_UI_SHOW(_external_ui_ptr);
_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
- (sigc::mem_fun(*this, &LV2PluginUI::output_update));
+ (sigc::mem_fun(*this, &LV2PluginUI::output_update));
+ if (_lv2->has_message_output()) {
+ _message_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect(
+ sigc::mem_fun(*this, &LV2PluginUI::update_timeout));
+ }
return false;
} else {
lv2ui_instantiate("gtk2gui");
@@ -446,13 +477,17 @@ LV2PluginUI::on_window_show(const std::string& title)
void
LV2PluginUI::on_window_hide()
{
- //cout << "on_window_hide" << endl; flush(cout);
+ //printf("LV2PluginUI::on_window_hide\n");
+ _message_update_connection.disconnect();
- if (_external_ui_ptr) {
+ if (_lv2->is_external_ui()) {
+ if (!_external_ui_ptr) { return; }
LV2_EXTERNAL_UI_HIDE(_external_ui_ptr);
- //slv2_ui_instance_get_descriptor(_inst)->cleanup(_inst);
- //_external_ui_ptr = NULL;
- //_screen_update_connection.disconnect();
+ if (!_lv2->is_external_kx()) { return ; }
+ _screen_update_connection.disconnect();
+ _external_ui_ptr = NULL;
+ suil_instance_free((SuilInstance*)_inst);
+ _inst = NULL;
} else {
lv2ui_free();
}