#include gboolean done = FALSE; static void open_done (GObject *source, GAsyncResult *result, gpointer data) { GtkFileDialog *dialog = GTK_FILE_DIALOG (source); GFile *file; GError *error = NULL; file = gtk_file_dialog_open_finish (dialog, result, &error); if (!file) { g_print ("Error: %s %d %s\n", g_quark_to_string (error->domain), error->code, error->message); g_error_free (error); } else { g_print ("%s\n", g_file_peek_path (file)); g_object_unref (file); } done = TRUE; } static void select_done (GObject *source, GAsyncResult *result, gpointer data) { GtkFileDialog *dialog = GTK_FILE_DIALOG (source); GFile *file; GError *error = NULL; file = gtk_file_dialog_select_folder_finish (dialog, result, &error); if (!file) { g_print ("Error: %s %d %s\n", g_quark_to_string (error->domain), error->code, error->message); g_error_free (error); } else { g_print ("%s\n", g_file_peek_path (file)); g_object_unref (file); } done = TRUE; } static void save_done (GObject *source, GAsyncResult *result, gpointer data) { GtkFileDialog *dialog = GTK_FILE_DIALOG (source); GFile *file; GError *error = NULL; file = gtk_file_dialog_save_finish (dialog, result, &error); if (!file) { g_print ("Error: %s %d %s\n", g_quark_to_string (error->domain), error->code, error->message); g_error_free (error); } else { g_print ("%s\n", g_file_peek_path (file)); g_object_unref (file); } done = TRUE; } static void open_multiple_done (GObject *source, GAsyncResult *result, gpointer data) { GtkFileDialog *dialog = GTK_FILE_DIALOG (source); GListModel *model; GError *error = NULL; model = gtk_file_dialog_open_multiple_finish (dialog, result, &error); if (!model) { g_print ("Error: %s %d %s\n", g_quark_to_string (error->domain), error->code, error->message); g_error_free (error); } else { for (unsigned int i = 0; i < g_list_model_get_n_items (model); i++) { GFile *file = g_list_model_get_item (model, i); g_print ("%s\n", g_file_peek_path (file)); g_object_unref (file); } g_object_unref (model); } done = TRUE; } static void select_multiple_done (GObject *source, GAsyncResult *result, gpointer data) { GtkFileDialog *dialog = GTK_FILE_DIALOG (source); GListModel *model; GError *error = NULL; model = gtk_file_dialog_select_multiple_folders_finish (dialog, result, &error); if (!model) { g_print ("Error: %s %d %s\n", g_quark_to_string (error->domain), error->code, error->message); g_error_free (error); } else { for (unsigned int i = 0; i < g_list_model_get_n_items (model); i++) { GFile *file = g_list_model_get_item (model, i); g_print ("%s\n", g_file_peek_path (file)); g_object_unref (file); } g_object_unref (model); } done = TRUE; } static int cancel_dialog (gpointer data) { GCancellable *cancellable = data; g_cancellable_cancel (cancellable); return G_SOURCE_REMOVE; } int main (int argc, char *argv[]) { GtkFileDialog *dialog; GCancellable *cancellable; char *title = NULL; gboolean modal = TRUE; char *initial_folder = NULL; char *initial_name = NULL; char *initial_file = NULL; char *accept_label = NULL; int timeout = -1; GOptionEntry options[] = { { "title", 0, 0, G_OPTION_ARG_STRING, &title, "Title", "TITLE" }, { "nonmodal", 0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &modal, "Non-modal", NULL }, { "initial-folder", 0, 0, G_OPTION_ARG_FILENAME, &initial_folder, "Initial folder", "FOLDER" }, { "initial-name", 0, 0, G_OPTION_ARG_STRING, &initial_name, "Initial name", "NAME" }, { "initial-file", 0, 0, G_OPTION_ARG_FILENAME, &initial_file, "Initial file", "FILE" }, { "accept-label", 0, 0, G_OPTION_ARG_STRING, &accept_label, "Accept label", "LABEL" }, { "timeout", 0, 0, G_OPTION_ARG_INT, &timeout, "Timeout", "SECONDS" }, { NULL } }; char *action = NULL; GOptionContext *context; GError *error = NULL; context = g_option_context_new ("ACTION"); g_option_context_add_main_entries (context, options, NULL); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_print ("Failed to parse args: %s\n", error->message); exit (1); } action = argv[1]; gtk_init (); dialog = gtk_file_dialog_new (); if (title) gtk_file_dialog_set_title (dialog, title); gtk_file_dialog_set_modal (dialog, modal); if (initial_folder) { GFile *file = g_file_new_for_commandline_arg (initial_folder); gtk_file_dialog_set_initial_folder (dialog, file); g_object_unref (file); } if (initial_name) gtk_file_dialog_set_initial_name (dialog, initial_name); if (initial_file) { GFile *file = g_file_new_for_commandline_arg (initial_file); gtk_file_dialog_set_initial_file (dialog, file); g_object_unref (file); } if (accept_label) gtk_file_dialog_set_accept_label (dialog, accept_label); cancellable = g_cancellable_new (); if (timeout > 0) g_timeout_add_seconds (timeout, cancel_dialog, cancellable); if (action == NULL) { g_print ("no action\n"); exit (1); } else if (strcmp (action, "open") == 0) gtk_file_dialog_open (dialog, NULL, cancellable, open_done, NULL); else if (g_pattern_match_simple ("select?folder", action) && strchr ("-_", action[strlen ("select")])) gtk_file_dialog_select_folder (dialog, NULL, cancellable, select_done, NULL); else if (strcmp (action, "save") == 0) gtk_file_dialog_save (dialog, NULL, cancellable, save_done, NULL); else if (g_pattern_match_simple ("open?multiple", action) && strchr ("-_", action[strlen ("open")])) gtk_file_dialog_open_multiple (dialog, NULL, cancellable, open_multiple_done, NULL); else if (g_pattern_match_simple ("select?multiple", action) && strchr ("-_", action[strlen ("select")])) gtk_file_dialog_select_multiple_folders (dialog, NULL, cancellable, select_multiple_done, NULL); else { g_print ("invalid action: %s\n", action); g_print ("one of open, select-folder, save, open-multiple, select-multiple\n"); exit (1); } while (!done) g_main_context_iteration (NULL, TRUE); g_object_unref (dialog); return 0; }