mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-09 08:14:58 +01:00
add LV2 support for kx:external-ui#
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 :(
This commit is contained in:
parent
4cdb018cae
commit
1d972d05c5
4 changed files with 19 additions and 4 deletions
|
|
@ -37,6 +37,8 @@
|
||||||
/** UI extension suitable for out-of-process UIs */
|
/** UI extension suitable for out-of-process UIs */
|
||||||
#define LV2_EXTERNAL_UI_URI "http://lv2plug.in/ns/extensions/ui#external"
|
#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
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -171,6 +171,7 @@ LV2PluginUI::output_update()
|
||||||
//cout << "output_update" << endl;
|
//cout << "output_update" << endl;
|
||||||
if (_external_ui_ptr) {
|
if (_external_ui_ptr) {
|
||||||
LV2_EXTERNAL_UI_RUN(_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) */
|
/* 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.URI = LV2_EXTERNAL_UI_URI;
|
||||||
_external_ui_feature.data = &_external_ui_host;
|
_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_count;
|
||||||
features = (LV2_Feature**)malloc(
|
features = (LV2_Feature**)malloc(
|
||||||
sizeof(LV2_Feature*) * (features_count + 1));
|
sizeof(LV2_Feature*) * (features_count + 2));
|
||||||
for (size_t i = 0; i < features_count - 1; ++i) {
|
for (size_t i = 0; i < features_count - 2; ++i) {
|
||||||
features[i] = features_src[i];
|
features[i] = features_src[i];
|
||||||
}
|
}
|
||||||
|
features[features_count - 2] = &_external_kxui_feature;
|
||||||
features[features_count - 1] = &_external_ui_feature;
|
features[features_count - 1] = &_external_ui_feature;
|
||||||
features[features_count] = NULL;
|
features[features_count] = NULL;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,7 @@ class LV2PluginUI : public PlugUIBase, public Gtk::VBox
|
||||||
std::vector<ControllableRef> _controllables;
|
std::vector<ControllableRef> _controllables;
|
||||||
struct lv2_external_ui_host _external_ui_host;
|
struct lv2_external_ui_host _external_ui_host;
|
||||||
LV2_Feature _external_ui_feature;
|
LV2_Feature _external_ui_feature;
|
||||||
|
LV2_Feature _external_kxui_feature;
|
||||||
struct lv2_external_ui* _external_ui_ptr;
|
struct lv2_external_ui* _external_ui_ptr;
|
||||||
LV2_Feature _parent_feature;
|
LV2_Feature _parent_feature;
|
||||||
Gtk::Window* _win_ptr;
|
Gtk::Window* _win_ptr;
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,7 @@ public:
|
||||||
LilvNode* time_Position;
|
LilvNode* time_Position;
|
||||||
LilvNode* ui_GtkUI;
|
LilvNode* ui_GtkUI;
|
||||||
LilvNode* ui_external;
|
LilvNode* ui_external;
|
||||||
|
LilvNode* ui_externalkx;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _bundle_checked;
|
bool _bundle_checked;
|
||||||
|
|
@ -561,11 +562,15 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
|
||||||
if (!_impl->ui) {
|
if (!_impl->ui) {
|
||||||
LILV_FOREACH(uis, i, uis) {
|
LILV_FOREACH(uis, i, uis) {
|
||||||
const LilvUI* ui = lilv_uis_get(uis, i);
|
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 = ui;
|
||||||
_impl->ui_type = _world.ui_external;
|
_impl->ui_type = _world.ui_external;
|
||||||
break;
|
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) {
|
if (!_impl->ui) {
|
||||||
return false;
|
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
|
bool
|
||||||
|
|
@ -1950,10 +1955,12 @@ LV2World::LV2World()
|
||||||
time_Position = lilv_new_uri(world, LV2_TIME__Position);
|
time_Position = lilv_new_uri(world, LV2_TIME__Position);
|
||||||
ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
|
ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI);
|
||||||
ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external");
|
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()
|
LV2World::~LV2World()
|
||||||
{
|
{
|
||||||
|
lilv_node_free(ui_externalkx);
|
||||||
lilv_node_free(ui_external);
|
lilv_node_free(ui_external);
|
||||||
lilv_node_free(ui_GtkUI);
|
lilv_node_free(ui_GtkUI);
|
||||||
lilv_node_free(time_Position);
|
lilv_node_free(time_Position);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue