summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/lv2_external_ui.h2
-rw-r--r--gtk2_ardour/lv2_plugin_ui.cc9
-rw-r--r--gtk2_ardour/lv2_plugin_ui.h1
-rw-r--r--libs/ardour/lv2_plugin.cc11
4 files changed, 19 insertions, 4 deletions
diff --git a/gtk2_ardour/lv2_external_ui.h b/gtk2_ardour/lv2_external_ui.h
index 19fa912f04..9f404e6d9a 100644
--- a/gtk2_ardour/lv2_external_ui.h
+++ b/gtk2_ardour/lv2_external_ui.h
@@ -37,6 +37,8 @@
/** UI extension suitable for out-of-process UIs */
#define LV2_EXTERNAL_UI_URI "http://lv2plug.in/ns/extensions/ui#external"
+#define LV2_EXTERNAL_UI_KX__Host "http://kxstudio.sf.net/ns/lv2ext/external-ui#Host"
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc
index 6f22ce5182..168f2d6798 100644
--- a/gtk2_ardour/lv2_plugin_ui.cc
+++ b/gtk2_ardour/lv2_plugin_ui.cc
@@ -171,6 +171,7 @@ LV2PluginUI::output_update()
//cout << "output_update" << endl;
if (_external_ui_ptr) {
LV2_EXTERNAL_UI_RUN(_external_ui_ptr);
+ if (!_external_ui_ptr) return; // ui was closed here
}
/* FIXME only works with control output ports (which is all we support now anyway) */
@@ -222,12 +223,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 {
diff --git a/gtk2_ardour/lv2_plugin_ui.h b/gtk2_ardour/lv2_plugin_ui.h
index edb90cb154..40e3890e1c 100644
--- a/gtk2_ardour/lv2_plugin_ui.h
+++ b/gtk2_ardour/lv2_plugin_ui.h
@@ -78,6 +78,7 @@ class LV2PluginUI : public PlugUIBase, public Gtk::VBox
std::vector<ControllableRef> _controllables;
struct lv2_external_ui_host _external_ui_host;
LV2_Feature _external_ui_feature;
+ LV2_Feature _external_kxui_feature;
struct lv2_external_ui* _external_ui_ptr;
LV2_Feature _parent_feature;
Gtk::Window* _win_ptr;
diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc
index 484965e8f4..c6e9b89e5b 100644
--- a/libs/ardour/lv2_plugin.cc
+++ b/libs/ardour/lv2_plugin.cc
@@ -142,6 +142,7 @@ public:
LilvNode* time_Position;
LilvNode* ui_GtkUI;
LilvNode* ui_external;
+ LilvNode* ui_externalkx;
private:
bool _bundle_checked;
@@ -561,11 +562,15 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
if (!_impl->ui) {
LILV_FOREACH(uis, i, uis) {
const LilvUI* ui = lilv_uis_get(uis, i);
- if (lilv_ui_is_a(ui, _world.ui_external)) {
+ if (lilv_ui_is_a(ui, _world.ui_externalkx)) {
_impl->ui = ui;
_impl->ui_type = _world.ui_external;
break;
}
+ if (lilv_ui_is_a(ui, _world.ui_external)) {
+ _impl->ui = ui;
+ _impl->ui_type = _world.ui_external;
+ }
}
}
}
@@ -613,7 +618,7 @@ LV2Plugin::is_external_ui() const
if (!_impl->ui) {
return false;
}
- return lilv_ui_is_a(_impl->ui, _world.ui_external);
+ return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx);
}
bool
@@ -1950,10 +1955,12 @@ LV2World::LV2World()
time_Position = lilv_new_uri(world, LV2_TIME__Position);
ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
+ ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget");
}
LV2World::~LV2World()
{
+ lilv_node_free(ui_externalkx);
lilv_node_free(ui_external);
lilv_node_free(ui_GtkUI);
lilv_node_free(time_Position);