static void ui_path_box_open_clicked(G_GNUC_UNUSED GtkButton *button, gpointer user_data) { GtkWidget *path_box = GTK_WIDGET(user_data); GtkFileChooserAction action = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(path_box), "action")); GtkEntry *entry = g_object_get_data(G_OBJECT(path_box), "entry"); const gchar *title = g_object_get_data(G_OBJECT(path_box), "title"); gchar *utf8_path = NULL; /* TODO: extend for other actions */ g_return_if_fail(action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER || action == GTK_FILE_CHOOSER_ACTION_OPEN); if (title == NULL) title = (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) ? _("Select Folder") : _("Select File"); if (action == GTK_FILE_CHOOSER_ACTION_OPEN) { utf8_path = run_file_chooser(title, action, gtk_entry_get_text(GTK_ENTRY(entry))); } else if (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) { gchar *path = g_path_get_dirname(gtk_entry_get_text(GTK_ENTRY(entry))); utf8_path = run_file_chooser(title, action, path); g_free(path); } if (utf8_path != NULL) { gtk_entry_set_text(GTK_ENTRY(entry), utf8_path); g_free(utf8_path); } }
GSList * show_file_chooser (const gchar *title, enum GtkuiFileChooserType type, gboolean select_multiple) { GtkFileChooserAction action; switch (type) { case GTKUI_FILECHOOSER_OPENFOLDER: action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; break; case GTKUI_FILECHOOSER_OPENFILE: case GTKUI_FILECHOOSER_LOADPLAYLIST: action = GTK_FILE_CHOOSER_ACTION_OPEN; break; case GTKUI_FILECHOOSER_SAVEPLAYLIST: action = GTK_FILE_CHOOSER_ACTION_SAVE; break; } GtkFileChooser *dlg = get_file_chooser(title, action, select_multiple); switch (type) { case GTKUI_FILECHOOSER_OPENFILE: set_file_filter (dlg, NULL); break; case GTKUI_FILECHOOSER_LOADPLAYLIST: set_file_filter_loadplaylist(dlg); break; case GTKUI_FILECHOOSER_SAVEPLAYLIST: gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dlg), TRUE); gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dlg), "untitled.dbpl"); set_file_filter_saveplaylist(dlg); break; } const char *conf_lastdir; switch (type) { case GTKUI_FILECHOOSER_OPENFOLDER: case GTKUI_FILECHOOSER_OPENFILE: conf_lastdir = "filechooser.lastdir"; break; case GTKUI_FILECHOOSER_LOADPLAYLIST: case GTKUI_FILECHOOSER_SAVEPLAYLIST: conf_lastdir = "filechooser.playlist.lastdir"; break; } // restore folder /* Windows: setting current folder for native filechooser here breaks restoring dirs, without it it still works fine? deadbeef->conf_lock (); gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (dlg), deadbeef->conf_get_str_fast (conf_lastdir, "")); deadbeef->conf_unlock (); */ int response = run_file_chooser(dlg); // store folder gchar *folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (dlg)); if (folder) { deadbeef->conf_set_str (conf_lastdir, folder); g_free (folder); } GSList *lst = NULL; if (response == GTK_RESPONSE_ACCEPT) { lst = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER (dlg)); #if defined USE_GTK_NATIVE_FILE_CHOOSER && defined __MINGW32__ // workaround: Gtk's win32 file chooser uses g_slist_prepend internally and forgets to reverse it before returning lst = g_slist_reverse (lst); #endif } destroy_file_chooser (dlg); return lst; }