static void gtk_file_chooser_native_set_choice (GtkFileChooser *chooser, const char *id, const char *selected) { GtkFileChooserNative *self = GTK_FILE_CHOOSER_NATIVE (chooser); GtkFileChooserNativeChoice *choice = find_choice (self, id); if (choice == NULL) { g_warning ("No choice with id %s found in %s %p", id, G_OBJECT_TYPE_NAME (self), self); return; } if ((choice->options && !g_strv_contains ((const char *const*)choice->options, selected)) || (!choice->options && !g_str_equal (selected, "true") && !g_str_equal (selected, "false"))) { g_warning ("Not a valid option for %s: %s", id, selected); return; } g_free (choice->selected); choice->selected = g_strdup (selected); gtk_file_chooser_set_choice (GTK_FILE_CHOOSER (self->dialog), id, selected); }
static void response_cb (GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data) { GtkFileChooserNative *self = user_data; FilechooserPortalData *data = self->mode_data; guint32 portal_response; int gtk_response; const char **uris; int i; GVariant *response_data; g_autoptr (GVariant) choices = NULL; g_variant_get (parameters, "(u@a{sv})", &portal_response, &response_data); g_variant_lookup (response_data, "uris", "^a&s", &uris); choices = g_variant_lookup_value (response_data, "choices", G_VARIANT_TYPE ("a(ss)")); if (choices) for (i = 0; i < g_variant_n_children (choices); i++) { const char *id; const char *selected; g_variant_get_child (choices, i, "(&s&s)", &id, &selected); gtk_file_chooser_set_choice (GTK_FILE_CHOOSER (self), id, selected); } g_slist_free_full (self->custom_files, g_object_unref); self->custom_files = NULL; for (i = 0; uris[i]; i++) self->custom_files = g_slist_prepend (self->custom_files, g_file_new_for_uri (uris[i])); switch (portal_response) { case 0: gtk_response = GTK_RESPONSE_OK; break; case 1: gtk_response = GTK_RESPONSE_CANCEL; break; case 2: default: gtk_response = GTK_RESPONSE_DELETE_EVENT; break; } filechooser_portal_data_free (data); self->mode_data = NULL; _gtk_native_dialog_emit_response (GTK_NATIVE_DIALOG (self), gtk_response); }