diff options
author | David Robillard <d@drobilla.net> | 2014-04-27 01:08:22 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2014-04-27 01:08:22 +0000 |
commit | ead6ca1b3ef519e57a03762b80d9b126c7883ea3 (patch) | |
tree | 5637524eb73438b07ec90a5e8dbec0cb48a802d3 | |
parent | c35b46cb80712a0c84fa87f9a55ba7fbf21e1963 (diff) | |
download | lv2-ead6ca1b3ef519e57a03762b80d9b126c7883ea3.tar.xz |
Implement show/hide fallback interface for sampler UI.
-rw-r--r-- | plugins/eg04-sampler.lv2/sampler.ttl | 1 | ||||
-rw-r--r-- | plugins/eg04-sampler.lv2/sampler_ui.c | 44 |
2 files changed, 45 insertions, 0 deletions
diff --git a/plugins/eg04-sampler.lv2/sampler.ttl b/plugins/eg04-sampler.lv2/sampler.ttl index f705dd1..2a89dd2 100644 --- a/plugins/eg04-sampler.lv2/sampler.ttl +++ b/plugins/eg04-sampler.lv2/sampler.ttl @@ -59,6 +59,7 @@ <http://lv2plug.in/plugins/eg-sampler#ui> a ui:GtkUI ; lv2:requiredFeature urid:map ; + lv2:extensionData ui:showInterface ; ui:portNotification [ ui:plugin <http://lv2plug.in/plugins/eg-sampler> ; lv2:symbol "notify" ; diff --git a/plugins/eg04-sampler.lv2/sampler_ui.c b/plugins/eg04-sampler.lv2/sampler_ui.c index 3eb1279..d691c98 100644 --- a/plugins/eg04-sampler.lv2/sampler_ui.c +++ b/plugins/eg04-sampler.lv2/sampler_ui.c @@ -42,6 +42,7 @@ typedef struct { GtkWidget* box; GtkWidget* button; GtkWidget* label; + GtkWidget* window; /* For optional show interface. */ } SamplerUI; static void @@ -101,6 +102,7 @@ instantiate(const LV2UI_Descriptor* descriptor, ui->box = NULL; ui->button = NULL; ui->label = NULL; + ui->window = NULL; *widget = NULL; @@ -170,9 +172,51 @@ port_event(LV2UI_Handle handle, } } +/* Optional non-embedded UI show interface. */ +static int +ui_show(LV2UI_Handle handle) +{ + SamplerUI* ui = (SamplerUI*)handle; + + int argc = 0; + gtk_init(&argc, NULL); + + ui->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_container_add(GTK_CONTAINER(ui->window), ui->box); + gtk_widget_show_all(ui->window); + gtk_window_present(GTK_WINDOW(ui->window)); + + return 0; +} + +/* Optional non-embedded UI hide interface. */ +static int +ui_hide(LV2UI_Handle handle) +{ + return 0; +} + +/* Idle interface for optional non-embedded UI. */ +static int +ui_idle(LV2UI_Handle handle) +{ + SamplerUI* ui = (SamplerUI*)handle; + if (ui->window) { + gtk_main_iteration(); + } + return 0; +} + static const void* extension_data(const char* uri) { + static const LV2UI_Show_Interface show = { ui_show, ui_hide }; + static const LV2UI_Idle_Interface idle = { ui_idle }; + if (!strcmp(uri, LV2_UI__showInterface)) { + return &show; + } else if (!strcmp(uri, LV2_UI__idleInterface)) { + return &idle; + } return NULL; } |