diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jalv.c | 5 | ||||
-rw-r--r-- | src/jalv_gtk.c | 38 | ||||
-rw-r--r-- | src/jalv_internal.h | 3 |
3 files changed, 46 insertions, 0 deletions
@@ -411,6 +411,7 @@ jalv_ui_instantiate(Jalv* jalv, const char* native_ui_type, void* parent) &parent_feature, &jalv->features.options_feature, &idle_feature, + &jalv->features.request_value_feature, NULL }; @@ -844,6 +845,10 @@ jalv_open(Jalv* const jalv, int* argc, char*** argv) init_feature(&jalv->features.log_feature, LV2_LOG__log, &jalv->features.llog); + jalv->features.request_value.handle = jalv; + init_feature(&jalv->features.request_value_feature, + LV2_UI__requestValue, &jalv->features.request_value); + zix_sem_init(&jalv->done, 0); zix_sem_init(&jalv->paused, 0); diff --git a/src/jalv_gtk.c b/src/jalv_gtk.c index 71259bd..5cf9a97 100644 --- a/src/jalv_gtk.c +++ b/src/jalv_gtk.c @@ -630,6 +630,42 @@ patch_put_get(Jalv* jalv, return 0; } +static LV2UI_Request_Value_Status +on_request_value(LV2UI_Feature_Handle handle, + const LV2_URID key, + const LV2_URID type, + const LV2_Feature* const* features) +{ + Jalv* jalv = (Jalv*)handle; + ControlID* control = get_property_control(&jalv->controls, key); + + if (!control) { + return LV2UI_REQUEST_VALUE_ERR_UNKNOWN; + } else if (control->value_type != jalv->forge.Path) { + return LV2UI_REQUEST_VALUE_ERR_UNSUPPORTED; + } + + GtkWidget* dialog = + gtk_file_chooser_dialog_new("Choose file", + GTK_WINDOW(jalv->window), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { + char* path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + set_control(control, strlen(path), jalv->forge.Path, path); + + g_free(path); + } + + gtk_widget_destroy(dialog); + + return 0; +} + static void property_changed(Jalv* jalv, LV2_URID key, const LV2_Atom* value) { @@ -1197,6 +1233,8 @@ jalv_open_ui(Jalv* jalv) jalv_ui_instantiate(jalv, jalv_native_ui_type(), alignment); } + jalv->features.request_value.request = on_request_value; + if (jalv->ui_instance) { GtkWidget* widget = (GtkWidget*)suil_instance_get_widget( jalv->ui_instance); diff --git a/src/jalv_internal.h b/src/jalv_internal.h index 4d25109..b48ca5d 100644 --- a/src/jalv_internal.h +++ b/src/jalv_internal.h @@ -39,6 +39,7 @@ #include "lv2/options/options.h" #include "lv2/resize-port/resize-port.h" #include "lv2/state/state.h" +#include "lv2/ui/ui.h" #include "lv2/urid/urid.h" #include "lv2/worker/worker.h" @@ -278,6 +279,8 @@ typedef struct { LV2_Options_Option options[6]; LV2_Feature options_feature; LV2_Feature safe_restore_feature; + LV2UI_Request_Value request_value; + LV2_Feature request_value_feature; LV2_Extension_Data_Feature ext_data; } JalvFeatures; |