add LV2 support for kx:external-ui#
authorRobin Gareus <robin@gareus.org>
Sun, 25 Aug 2013 14:20:27 +0000 (16:20 +0200)
committerRobin Gareus <robin@gareus.org>
Sun, 25 Aug 2013 14:21:18 +0000 (16:21 +0200)
the ABI of http://kxstudio.sf.net/ns/lv2ext/external-ui# is identical to
http://lv2plug.in/ns/extensions/ui#external
It just adds a distinction between #Host and #Widget for cosmetic reasons.
Sadly some newer plugins are released with only support for kxstudio URI :(

gtk2_ardour/lv2_external_ui.h
gtk2_ardour/lv2_plugin_ui.cc
gtk2_ardour/lv2_plugin_ui.h
libs/ardour/lv2_plugin.cc

index 19fa912f04616372695fce0a67d31957c96978ed..9f404e6d9aed5540071af2cd7151d26bf5026ddb 100644 (file)
@@ -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
index 6f22ce51827f1e74f6aaba5d86bbd01e562366a3..168f2d6798e12021a98cb70dc632c38346dffa9b 100644 (file)
@@ -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 {
index edb90cb1547031a1e4d98c720f387e1a8930574a..40e3890e1ce6a8a380f24eaf5b1c4e76c61b92b7 100644 (file)
@@ -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;
index 484965e8f45b645c75a9e6f4bade84f968d146c5..c6e9b89e5b198a7dbcfba1ff379bc386656d897b 100644 (file)
@@ -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);