diff options
Diffstat (limited to 'gtk/gtkfilechooserbutton.c')
-rw-r--r-- | gtk/gtkfilechooserbutton.c | 587 |
1 files changed, 284 insertions, 303 deletions
diff --git a/gtk/gtkfilechooserbutton.c b/gtk/gtkfilechooserbutton.c index 9e31e05063..bca2312a96 100644 --- a/gtk/gtkfilechooserbutton.c +++ b/gtk/gtkfilechooserbutton.c @@ -52,10 +52,6 @@ #include "gtkfilechooserbutton.h" -#ifdef G_OS_WIN32 -#include "gtkfilesystemwin32.h" -#endif - #include "gtkprivate.h" #include "gtkalias.h" @@ -102,7 +98,7 @@ enum TYPE_COLUMN, DATA_COLUMN, IS_FOLDER_COLUMN, - HANDLE_COLUMN, + CANCELLABLE_COLUMN, NUM_COLUMNS }; @@ -143,7 +139,7 @@ struct _GtkFileChooserButtonPrivate gchar *backend; GtkFileSystem *fs; - GtkFilePath *old_path; + GFile *old_file; gulong combo_box_changed_id; gulong dialog_file_activated_id; @@ -152,9 +148,9 @@ struct _GtkFileChooserButtonPrivate gulong fs_volumes_changed_id; gulong fs_bookmarks_changed_id; - GtkFileSystemHandle *dnd_select_folder_handle; - GtkFileSystemHandle *update_button_handle; - GSList *change_icon_theme_handles; + GCancellable *dnd_select_folder_cancellable; + GCancellable *update_button_cancellable; + GSList *change_icon_theme_cancellables; gint icon_size; @@ -195,10 +191,10 @@ enum /* GtkFileChooserIface Functions */ static void gtk_file_chooser_button_file_chooser_iface_init (GtkFileChooserIface *iface); static gboolean gtk_file_chooser_button_add_shortcut_folder (GtkFileChooser *chooser, - const GtkFilePath *path, + GFile *file, GError **error); static gboolean gtk_file_chooser_button_remove_shortcut_folder (GtkFileChooser *chooser, - const GtkFilePath *path, + GFile *file, GError **error); /* GObject Functions */ @@ -240,8 +236,8 @@ static void gtk_file_chooser_button_screen_changed (GtkWidget *wi /* Utility Functions */ static GtkIconTheme *get_icon_theme (GtkWidget *widget); -static void set_info_for_path_at_iter (GtkFileChooserButton *fs, - const GtkFilePath *path, +static void set_info_for_file_at_iter (GtkFileChooserButton *fs, + GFile *file, GtkTreeIter *iter); static gint model_get_type_position (GtkFileChooserButton *button, @@ -255,7 +251,7 @@ static void model_add_volumes (GtkFileChooserButton *button, static void model_add_bookmarks (GtkFileChooserButton *button, GSList *bookmarks); static void model_update_current_folder (GtkFileChooserButton *button, - const GtkFilePath *path); + GFile *file); static void model_remove_rows (GtkFileChooserButton *button, gint pos, gint n_rows); @@ -486,7 +482,7 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button) G_TYPE_CHAR, /* Row Type */ G_TYPE_POINTER /* Volume || Path */, G_TYPE_BOOLEAN /* Is Folder? */, - G_TYPE_POINTER /* handle */)); + G_TYPE_POINTER /* cancellable */)); priv->combo_box = gtk_combo_box_new (); priv->combo_box_changed_id = @@ -537,16 +533,16 @@ gtk_file_chooser_button_file_chooser_iface_init (GtkFileChooserIface *iface) } static gboolean -gtk_file_chooser_button_add_shortcut_folder (GtkFileChooser *chooser, - const GtkFilePath *path, - GError **error) +gtk_file_chooser_button_add_shortcut_folder (GtkFileChooser *chooser, + GFile *file, + GError **error) { GtkFileChooser *delegate; gboolean retval; delegate = g_object_get_qdata (G_OBJECT (chooser), GTK_FILE_CHOOSER_DELEGATE_QUARK); - retval = _gtk_file_chooser_add_shortcut_folder (delegate, path, error); + retval = _gtk_file_chooser_add_shortcut_folder (delegate, file, error); if (retval) { @@ -563,10 +559,10 @@ gtk_file_chooser_button_add_shortcut_folder (GtkFileChooser *chooser, ICON_COLUMN, NULL, DISPLAY_NAME_COLUMN, _(FALLBACK_DISPLAY_NAME), TYPE_COLUMN, ROW_TYPE_SHORTCUT, - DATA_COLUMN, gtk_file_path_copy (path), + DATA_COLUMN, g_object_ref (file), IS_FOLDER_COLUMN, FALSE, -1); - set_info_for_path_at_iter (button, path, &iter); + set_info_for_file_at_iter (button, file, &iter); priv->n_shortcuts++; gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter_model)); @@ -576,9 +572,9 @@ gtk_file_chooser_button_add_shortcut_folder (GtkFileChooser *chooser, } static gboolean -gtk_file_chooser_button_remove_shortcut_folder (GtkFileChooser *chooser, - const GtkFilePath *path, - GError **error) +gtk_file_chooser_button_remove_shortcut_folder (GtkFileChooser *chooser, + GFile *file, + GError **error) { GtkFileChooser *delegate; gboolean retval; @@ -586,7 +582,7 @@ gtk_file_chooser_button_remove_shortcut_folder (GtkFileChooser *chooser, delegate = g_object_get_qdata (G_OBJECT (chooser), GTK_FILE_CHOOSER_DELEGATE_QUARK); - retval = _gtk_file_chooser_remove_shortcut_folder (delegate, path, error); + retval = _gtk_file_chooser_remove_shortcut_folder (delegate, file, error); if (retval) { @@ -609,8 +605,7 @@ gtk_file_chooser_button_remove_shortcut_folder (GtkFileChooser *chooser, -1); if (type == ROW_TYPE_SHORTCUT && - data && - gtk_file_path_compare (data, path) == 0) + data && g_file_equal (data, file)) { model_free_row_data (GTK_FILE_CHOOSER_BUTTON (chooser), &iter); gtk_list_store_remove (GTK_LIST_STORE (priv->model), &iter); @@ -728,7 +723,8 @@ gtk_file_chooser_button_constructor (GType type, list = gtk_file_system_list_bookmarks (priv->fs); model_add_bookmarks (button, list); - gtk_file_paths_free (list); + g_slist_foreach (list, (GFunc) g_object_unref, NULL); + g_slist_free (list); model_add_other (button); @@ -899,8 +895,8 @@ gtk_file_chooser_button_finalize (GObject *object) GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object); GtkFileChooserButtonPrivate *priv = button->priv; - if (priv->old_path) - gtk_file_path_free (priv->old_path); + if (priv->old_file) + g_object_unref (priv->old_file); if (G_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->finalize != NULL) (*G_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->finalize) (object); @@ -930,27 +926,27 @@ gtk_file_chooser_button_destroy (GtkObject *object) } while (gtk_tree_model_iter_next (priv->model, &iter)); - if (priv->dnd_select_folder_handle) + if (priv->dnd_select_folder_cancellable) { - gtk_file_system_cancel_operation (priv->dnd_select_folder_handle); - priv->dnd_select_folder_handle = NULL; + g_cancellable_cancel (priv->dnd_select_folder_cancellable); + priv->dnd_select_folder_cancellable = NULL; } - if (priv->update_button_handle) + if (priv->update_button_cancellable) { - gtk_file_system_cancel_operation (priv->update_button_handle); - priv->update_button_handle = NULL; + g_cancellable_cancel (priv->update_button_cancellable); + priv->update_button_cancellable = NULL; } - if (priv->change_icon_theme_handles) + if (priv->change_icon_theme_cancellables) { - for (l = priv->change_icon_theme_handles; l; l = l->next) + for (l = priv->change_icon_theme_cancellables; l; l = l->next) { - GtkFileSystemHandle *handle = GTK_FILE_SYSTEM_HANDLE (l->data); - gtk_file_system_cancel_operation (handle); + GCancellable *cancellable = G_CANCELLABLE (l->data); + g_cancellable_cancel (cancellable); } - g_slist_free (priv->change_icon_theme_handles); - priv->change_icon_theme_handles = NULL; + g_slist_free (priv->change_icon_theme_cancellables); + priv->change_icon_theme_cancellables = NULL; } if (priv->model) @@ -984,45 +980,48 @@ gtk_file_chooser_button_destroy (GtkObject *object) struct DndSelectFolderData { + GtkFileSystem *file_system; GtkFileChooserButton *button; GtkFileChooserAction action; - GtkFilePath *path; + GFile *file; gchar **uris; guint i; gboolean selected; }; static void -dnd_select_folder_get_info_cb (GtkFileSystemHandle *handle, - const GtkFileInfo *info, - const GError *error, - gpointer user_data) +dnd_select_folder_get_info_cb (GCancellable *cancellable, + GFileInfo *info, + const GError *error, + gpointer user_data) { - gboolean cancelled = handle->cancelled; + gboolean cancelled = g_cancellable_is_cancelled (cancellable); struct DndSelectFolderData *data = user_data; - if (handle != data->button->priv->dnd_select_folder_handle) + if (cancellable != data->button->priv->dnd_select_folder_cancellable) { g_object_unref (data->button); - gtk_file_path_free (data->path); + g_object_unref (data->file); g_strfreev (data->uris); g_free (data); - g_object_unref (handle); + g_object_unref (cancellable); return; } - data->button->priv->dnd_select_folder_handle = NULL; + data->button->priv->dnd_select_folder_cancellable = NULL; if (!cancelled && !error && info != NULL) { - data->selected = - (((data->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER && - gtk_file_info_get_is_folder (info)) || - (data->action == GTK_FILE_CHOOSER_ACTION_OPEN && - !gtk_file_info_get_is_folder (info))) && - _gtk_file_chooser_select_path (GTK_FILE_CHOOSER (data->button->priv->dialog), - data->path, NULL)); + gboolean is_folder; + + is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY); + + data->selected = + (((data->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER && is_folder) || + (data->action == GTK_FILE_CHOOSER_ACTION_OPEN && !is_folder)) && + _gtk_file_chooser_select_file (GTK_FILE_CHOOSER (data->button->priv->dialog), + data->file, NULL)); } else data->selected = FALSE; @@ -1030,26 +1029,25 @@ dnd_select_folder_get_info_cb (GtkFileSystemHandle *handle, if (data->selected || data->uris[++data->i] == NULL) { g_object_unref (data->button); - gtk_file_path_free (data->path); + g_object_unref (data->file); g_strfreev (data->uris); g_free (data); - g_object_unref (handle); + g_object_unref (cancellable); return; } - if (data->path) - gtk_file_path_free (data->path); + if (data->file) + g_object_unref (data->file); - data->path = gtk_file_system_uri_to_path (handle->file_system, - data->uris[data->i]); + data->file = g_file_new_for_uri (data->uris[data->i]); - data->button->priv->dnd_select_folder_handle = - gtk_file_system_get_info (handle->file_system, data->path, - GTK_FILE_INFO_IS_FOLDER, + data->button->priv->dnd_select_folder_cancellable = + gtk_file_system_get_info (data->file_system, data->file, + "standard::type", dnd_select_folder_get_info_cb, user_data); - g_object_unref (handle); + g_object_unref (cancellable); } static void @@ -1063,7 +1061,7 @@ gtk_file_chooser_button_drag_data_received (GtkWidget *widget, { GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget); GtkFileChooserButtonPrivate *priv = button->priv; - GtkFilePath *path; + GFile *file; gchar *text; if (GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->drag_data_received != NULL) @@ -1093,27 +1091,28 @@ gtk_file_chooser_button_drag_data_received (GtkWidget *widget, info->i = 0; info->uris = uris; info->selected = FALSE; + info->file_system = priv->fs; g_object_get (priv->dialog, "action", &info->action, NULL); - info->path = gtk_file_system_uri_to_path (priv->fs, - info->uris[info->i]); + info->file = g_file_new_for_uri (info->uris[info->i]); - if (priv->dnd_select_folder_handle) - gtk_file_system_cancel_operation (priv->dnd_select_folder_handle); + if (priv->dnd_select_folder_cancellable) + g_cancellable_cancel (priv->dnd_select_folder_cancellable); - priv->dnd_select_folder_handle = - gtk_file_system_get_info (priv->fs, info->path, - GTK_FILE_INFO_IS_FOLDER, + priv->dnd_select_folder_cancellable = + gtk_file_system_get_info (priv->fs, info->file, + "standard::type", dnd_select_folder_get_info_cb, info); } break; case TEXT_PLAIN: text = (char*) gtk_selection_data_get_text (data); - path = gtk_file_path_new_steal (text); - _gtk_file_chooser_select_path (GTK_FILE_CHOOSER (priv->dialog), path, + file = g_file_new_for_uri (text); + _gtk_file_chooser_select_file (GTK_FILE_CHOOSER (priv->dialog), file, NULL); - gtk_file_path_free (path); + g_object_unref (file); + g_free (text); break; default: @@ -1212,26 +1211,25 @@ struct ChangeIconThemeData }; static void -change_icon_theme_get_info_cb (GtkFileSystemHandle *handle, - const GtkFileInfo *info, - const GError *error, - gpointer user_data) +change_icon_theme_get_info_cb (GCancellable *cancellable, + GFileInfo *info, + const GError *error, + gpointer user_data) { - gboolean cancelled = handle->cancelled; + gboolean cancelled = g_cancellable_is_cancelled (cancellable); GdkPixbuf *pixbuf; struct ChangeIconThemeData *data = user_data; - if (!g_slist_find (data->button->priv->change_icon_theme_handles, handle)) + if (!g_slist_find (data->button->priv->change_icon_theme_cancellables, cancellable)) goto out; - data->button->priv->change_icon_theme_handles = - g_slist_remove (data->button->priv->change_icon_theme_handles, handle); + data->button->priv->change_icon_theme_cancellables = + g_slist_remove (data->button->priv->change_icon_theme_cancellables, cancellable); if (cancelled || error) goto out; - pixbuf = gtk_file_info_render_icon (info, GTK_WIDGET (data->button), - data->button->priv->icon_size, NULL); + pixbuf = gtk_file_info_render_icon (info, GTK_WIDGET (data->button), data->button->priv->icon_size); if (pixbuf) { @@ -1263,7 +1261,7 @@ out: gtk_tree_row_reference_free (data->row_ref); g_free (data); - g_object_unref (handle); + g_object_unref (cancellable); } static void @@ -1276,13 +1274,13 @@ change_icon_theme (GtkFileChooserButton *button) GSList *l; gint width = 0, height = 0; - for (l = button->priv->change_icon_theme_handles; l; l = l->next) + for (l = button->priv->change_icon_theme_cancellables; l; l = l->next) { - GtkFileSystemHandle *handle = GTK_FILE_SYSTEM_HANDLE (l->data); - gtk_file_system_cancel_operation (handle); + GCancellable *cancellable = G_CANCELLABLE (l->data); + g_cancellable_cancel (cancellable); } - g_slist_free (button->priv->change_icon_theme_handles); - button->priv->change_icon_theme_handles = NULL; + g_slist_free (button->priv->change_icon_theme_cancellables); + button->priv->change_icon_theme_cancellables = NULL; settings = gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (button))); @@ -1318,10 +1316,10 @@ change_icon_theme (GtkFileChooserButton *button) case ROW_TYPE_CURRENT_FOLDER: if (data) { - if (gtk_file_system_path_is_local (priv->fs, (GtkFilePath *)data)) + if (g_file_is_native (G_FILE (data))) { GtkTreePath *path; - GtkFileSystemHandle *handle; + GCancellable *cancellable; struct ChangeIconThemeData *info; info = g_new0 (struct ChangeIconThemeData, 1); @@ -1329,13 +1327,14 @@ change_icon_theme (GtkFileChooserButton *button) path = gtk_tree_model_get_path (priv->model, &iter); info->row_ref = gtk_tree_row_reference_new (priv->model, path); gtk_tree_path_free (path); - - handle = - gtk_file_system_get_info (priv->fs, data, GTK_FILE_INFO_ICON, + + cancellable = + gtk_file_system_get_info (priv->fs, data, + "standard::icon", change_icon_theme_get_info_cb, info); - button->priv->change_icon_theme_handles = - g_slist_append (button->priv->change_icon_theme_handles, handle); + button->priv->change_icon_theme_cancellables = + g_slist_append (button->priv->change_icon_theme_cancellables, cancellable); pixbuf = NULL; } else @@ -1353,7 +1352,7 @@ change_icon_theme (GtkFileChooserButton *button) break; case ROW_TYPE_VOLUME: if (data) - pixbuf = gtk_file_system_volume_render_icon (priv->fs, data, + pixbuf = gtk_file_system_volume_render_icon (data, GTK_WIDGET (button), priv->icon_size, NULL); @@ -1430,17 +1429,18 @@ struct SetDisplayNameData }; static void -set_info_get_info_cb (GtkFileSystemHandle *handle, - const GtkFileInfo *info, - const GError *error, - gpointer callback_data) +set_info_get_info_cb (GCancellable *cancellable, + GFileInfo *info, + const GError *error, + gpointer callback_data) { - gboolean cancelled = handle->cancelled; + gboolean cancelled = g_cancellable_is_cancelled (cancellable); GdkPixbuf *pixbuf; GtkTreePath *path; GtkTreeIter iter; - GtkFileSystemHandle *model_handle; + GCancellable *model_cancellable; struct SetDisplayNameData *data = callback_data; + gboolean is_folder; if (!data->button->priv->model) /* button got destroyed */ @@ -1448,37 +1448,38 @@ set_info_get_info_cb (GtkFileSystemHandle *handle, path = gtk_tree_row_reference_get_path (data->row_ref); if (!path) - /* Handle doesn't exist anymore in the model */ + /* Cancellable doesn't exist anymore in the model */ goto out; gtk_tree_model_get_iter (data->button->priv->model, &iter, path); gtk_tree_path_free (path); - /* Validate the handle */ + /* Validate the cancellable */ gtk_tree_model_get (data->button->priv->model, &iter, - HANDLE_COLUMN, &model_handle, + CANCELLABLE_COLUMN, &model_cancellable, -1); - if (handle != model_handle) + if (cancellable != model_cancellable) goto out; gtk_list_store_set (GTK_LIST_STORE (data->button->priv->model), &iter, - HANDLE_COLUMN, NULL, + CANCELLABLE_COLUMN, NULL, -1); if (cancelled || error) /* There was an error, leave the fallback name in there */ goto out; - pixbuf = gtk_file_info_render_icon (info, GTK_WIDGET (data->button), - data->button->priv->icon_size, NULL); + pixbuf = gtk_file_info_render_icon (info, GTK_WIDGET (data->button), data->button->priv->icon_size); if (!data->label) - data->label = g_strdup (gtk_file_info_get_display_name (info)); + data->label = g_strdup (g_file_info_get_display_name (info)); + + is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY); gtk_list_store_set (GTK_LIST_STORE (data->button->priv->model), &iter, ICON_COLUMN, pixbuf, DISPLAY_NAME_COLUMN, data->label, - IS_FOLDER_COLUMN, gtk_file_info_get_is_folder (info), + IS_FOLDER_COLUMN, is_folder, -1); if (pixbuf) @@ -1490,32 +1491,32 @@ out: gtk_tree_row_reference_free (data->row_ref); g_free (data); - g_object_unref (handle); + g_object_unref (cancellable); } static void -set_info_for_path_at_iter (GtkFileChooserButton *button, - const GtkFilePath *path, +set_info_for_file_at_iter (GtkFileChooserButton *button, + GFile *file, GtkTreeIter *iter) { struct SetDisplayNameData *data; GtkTreePath *tree_path; - GtkFileSystemHandle *handle; + GCancellable *cancellable; data = g_new0 (struct SetDisplayNameData, 1); data->button = g_object_ref (button); - data->label = gtk_file_system_get_bookmark_label (button->priv->fs, path); + data->label = gtk_file_system_get_bookmark_label (button->priv->fs, file); tree_path = gtk_tree_model_get_path (button->priv->model, iter); data->row_ref = gtk_tree_row_reference_new (button->priv->model, tree_path); gtk_tree_path_free (tree_path); - handle = gtk_file_system_get_info (button->priv->fs, path, - GTK_FILE_INFO_DISPLAY_NAME | GTK_FILE_INFO_IS_FOLDER | GTK_FILE_INFO_ICON, - set_info_get_info_cb, data); + cancellable = gtk_file_system_get_info (button->priv->fs, file, + "standard::type,standard::icon,standard::display-name", + set_info_get_info_cb, data); gtk_list_store_set (GTK_LIST_STORE (button->priv->model), iter, - HANDLE_COLUMN, handle, + CANCELLABLE_COLUMN, cancellable, -1); } @@ -1579,16 +1580,16 @@ model_free_row_data (GtkFileChooserButton *button, { gchar type; gpointer data; - GtkFileSystemHandle *handle; + GCancellable *cancellable; gtk_tree_model_get (button->priv->model, iter, TYPE_COLUMN, &type, DATA_COLUMN, &data, - HANDLE_COLUMN, &handle, + CANCELLABLE_COLUMN, &cancellable, -1); - if (handle) - gtk_file_system_cancel_operation (handle); + if (cancellable) + g_cancellable_cancel (cancellable); switch (type) { @@ -1596,10 +1597,10 @@ model_free_row_data (GtkFileChooserButton *button, case ROW_TYPE_SHORTCUT: case ROW_TYPE_BOOKMARK: case ROW_TYPE_CURRENT_FOLDER: - gtk_file_path_free (data); + g_object_unref (data); break; case ROW_TYPE_VOLUME: - gtk_file_system_volume_free (button->priv->fs, data); + gtk_file_system_volume_free (data); break; default: break; @@ -1607,16 +1608,16 @@ model_free_row_data (GtkFileChooserButton *button, } static void -model_add_special_get_info_cb (GtkFileSystemHandle *handle, - const GtkFileInfo *info, - const GError *error, - gpointer user_data) +model_add_special_get_info_cb (GCancellable *cancellable, + GFileInfo *info, + const GError *error, + gpointer user_data) { - gboolean cancelled = handle->cancelled; + gboolean cancelled = g_cancellable_is_cancelled (cancellable); GtkTreeIter iter; GtkTreePath *path; GdkPixbuf *pixbuf; - GtkFileSystemHandle *model_handle; + GCancellable *model_cancellable; struct ChangeIconThemeData *data = user_data; gchar *name; @@ -1626,27 +1627,26 @@ model_add_special_get_info_cb (GtkFileSystemHandle *handle, path = gtk_tree_row_reference_get_path (data->row_ref); if (!path) - /* Handle doesn't exist anymore in the model */ + /* Cancellable doesn't exist anymore in the model */ goto out; gtk_tree_model_get_iter (data->button->priv->model, &iter, path); gtk_tree_path_free (path); gtk_tree_model_get (data->button->priv->model, &iter, - HANDLE_COLUMN, &model_handle, + CANCELLABLE_COLUMN, &model_cancellable, -1); - if (handle != model_handle) + if (cancellable != model_cancellable) goto out; gtk_list_store_set (GTK_LIST_STORE (data->button->priv->model), &iter, - HANDLE_COLUMN, NULL, + CANCELLABLE_COLUMN, NULL, -1); if (cancelled || error) goto out; - pixbuf = gtk_file_info_render_icon (info, GTK_WIDGET (data->button), - data->button->priv->icon_size, NULL); + pixbuf = gtk_file_info_render_icon (info, GTK_WIDGET (data->button), data->button->priv->icon_size); if (pixbuf) { @@ -1661,7 +1661,7 @@ model_add_special_get_info_cb (GtkFileSystemHandle *handle, -1); if (!name) gtk_list_store_set (GTK_LIST_STORE (data->button->priv->model), &iter, - DISPLAY_NAME_COLUMN, gtk_file_info_get_display_name (info), + DISPLAY_NAME_COLUMN, g_file_info_get_display_name (info), -1); g_free (name); @@ -1670,7 +1670,7 @@ out: gtk_tree_row_reference_free (data->row_ref); g_free (data); - g_object_unref (handle); + g_object_unref (cancellable); } static inline void @@ -1680,7 +1680,7 @@ model_add_special (GtkFileChooserButton *button) const gchar *desktopdir; GtkListStore *store; GtkTreeIter iter; - GtkFilePath *path; + GFile *file; gint pos; store = GTK_LIST_STORE (button->priv->model); @@ -1691,10 +1691,10 @@ model_add_special (GtkFileChooserButton *button) if (homedir) { GtkTreePath *tree_path; - GtkFileSystemHandle *handle; + GCancellable *cancellable; struct ChangeIconThemeData *info; - path = gtk_file_system_filename_to_path (button->priv->fs, homedir); + file = g_file_new_for_path (homedir); gtk_list_store_insert (store, &iter, pos); pos++; @@ -1705,17 +1705,17 @@ model_add_special (GtkFileChooserButton *button) tree_path); gtk_tree_path_free (tree_path); - handle = gtk_file_system_get_info (button->priv->fs, path, - GTK_FILE_INFO_DISPLAY_NAME | GTK_FILE_INFO_ICON, - model_add_special_get_info_cb, info); + cancellable = gtk_file_system_get_info (button->priv->fs, file, + "standard::icon,standard::display-name", + model_add_special_get_info_cb, info); gtk_list_store_set (store, &iter, ICON_COLUMN, NULL, DISPLAY_NAME_COLUMN, NULL, TYPE_COLUMN, ROW_TYPE_SPECIAL, - DATA_COLUMN, path, + DATA_COLUMN, file, IS_FOLDER_COLUMN, TRUE, - HANDLE_COLUMN, handle, + CANCELLABLE_COLUMN, cancellable, -1); button->priv->n_special++; @@ -1726,10 +1726,10 @@ model_add_special (GtkFileChooserButton *button) if (desktopdir) { GtkTreePath *tree_path; - GtkFileSystemHandle *handle; + GCancellable *cancellable; struct ChangeIconThemeData *info; - path = gtk_file_system_filename_to_path (button->priv->fs, desktopdir); + file = g_file_new_for_path (desktopdir); gtk_list_store_insert (store, &iter, pos); pos++; @@ -1740,17 +1740,17 @@ model_add_special (GtkFileChooserButton *button) tree_path); gtk_tree_path_free (tree_path); - handle = gtk_file_system_get_info (button->priv->fs, path, - GTK_FILE_INFO_DISPLAY_NAME | GTK_FILE_INFO_ICON, - model_add_special_get_info_cb, info); + cancellable = gtk_file_system_get_info (button->priv->fs, file, + "standard::icon,standard::display-name", + model_add_special_get_info_cb, info); gtk_list_store_set (store, &iter, TYPE_COLUMN, ROW_TYPE_SPECIAL, ICON_COLUMN, NULL, DISPLAY_NAME_COLUMN, _(DESKTOP_DISPLAY_NAME), - DATA_COLUMN, path, + DATA_COLUMN, file, IS_FOLDER_COLUMN, TRUE, - HANDLE_COLUMN, handle, + CANCELLABLE_COLUMN, cancellable, -1); button->priv->n_special++; @@ -1786,31 +1786,24 @@ model_add_volumes (GtkFileChooserButton *button, if (local_only) { - if (gtk_file_system_volume_get_is_mounted (file_system, volume)) + if (gtk_file_system_volume_is_mounted (volume)) { - GtkFilePath *base_path; + GFile *base_file; - base_path = gtk_file_system_volume_get_base_path (file_system, volume); - if (base_path != NULL) + base_file = gtk_file_system_volume_get_root (volume); + if (base_file != NULL && !g_file_is_native (base_file)) { - gboolean is_local = gtk_file_system_path_is_local (file_system, base_path); - gtk_file_path_free (base_path); - - if (!is_local) - { - gtk_file_system_volume_free (file_system, volume); - continue; - } + gtk_file_system_volume_free (volume); + continue; } } } - pixbuf = gtk_file_system_volume_render_icon (file_system, - volume, + pixbuf = gtk_file_system_volume_render_icon (volume, GTK_WIDGET (button), button->priv->icon_size, NULL); - display_name = gtk_file_system_volume_get_display_name (file_system, volume); + display_name = gtk_file_system_volume_get_display_name (volume); gtk_list_store_insert (store, &iter, pos); gtk_list_store_set (store, &iter, @@ -1830,7 +1823,7 @@ model_add_volumes (GtkFileChooserButton *button, } } -extern gchar * _gtk_file_chooser_label_for_uri (const gchar *uri); +extern gchar * _gtk_file_chooser_label_for_file (const gchar *uri); static void model_add_bookmarks (GtkFileChooserButton *button, @@ -1851,21 +1844,21 @@ model_add_bookmarks (GtkFileChooserButton *button, for (l = bookmarks; l; l = l->next) { - GtkFilePath *path; + GFile *file; - path = l->data; + file = l->data; - if (gtk_file_system_path_is_local (button->priv->fs, path)) + if (g_file_is_native (file)) { gtk_list_store_insert (store, &iter, pos); gtk_list_store_set (store, &iter, ICON_COLUMN, NULL, DISPLAY_NAME_COLUMN, _(FALLBACK_DISPLAY_NAME), TYPE_COLUMN, ROW_TYPE_BOOKMARK, - DATA_COLUMN, gtk_file_path_copy (path), + DATA_COLUMN, g_object_ref (file), IS_FOLDER_COLUMN, FALSE, -1); - set_info_for_path_at_iter (button, path, &iter); + set_info_for_file_at_iter (button, file, &iter); } else { @@ -1881,15 +1874,9 @@ model_add_bookmarks (GtkFileChooserButton *button, * If we switch to a better bookmarks file format (XBEL), we * should use mime info to get a better icon. */ - label = gtk_file_system_get_bookmark_label (button->priv->fs, path); + label = gtk_file_system_get_bookmark_label (button->priv->fs, file); if (!label) - { - gchar *uri; - - uri = gtk_file_system_path_to_uri (button->priv->fs, path); - label = _gtk_file_chooser_label_for_uri (uri); - g_free (uri); - } + label = _gtk_file_chooser_label_for_file (file); icon_theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (button))); pixbuf = gtk_icon_theme_load_icon (icon_theme, "gnome-fs-share", @@ -1900,7 +1887,7 @@ model_add_bookmarks (GtkFileChooserButton *button, ICON_COLUMN, pixbuf, DISPLAY_NAME_COLUMN, label, TYPE_COLUMN, ROW_TYPE_BOOKMARK, - DATA_COLUMN, gtk_file_path_copy (path), + DATA_COLUMN, g_object_ref (file), IS_FOLDER_COLUMN, TRUE, -1); @@ -1931,13 +1918,13 @@ model_add_bookmarks (GtkFileChooserButton *button, static void model_update_current_folder (GtkFileChooserButton *button, - const GtkFilePath *path) + GFile *file) { GtkListStore *store; GtkTreeIter iter; gint pos; - if (!path) + if (!file) return; store = GTK_LIST_STORE (button->priv->model); @@ -1968,16 +1955,16 @@ model_update_current_folder (GtkFileChooserButton *button, model_free_row_data (button, &iter); } - if (gtk_file_system_path_is_local (button->priv->fs, path)) + if (g_file_is_native (file)) { gtk_list_store_set (store, &iter, ICON_COLUMN, NULL, DISPLAY_NAME_COLUMN, _(FALLBACK_DISPLAY_NAME), TYPE_COLUMN, ROW_TYPE_CURRENT_FOLDER, - DATA_COLUMN, gtk_file_path_copy (path), + DATA_COLUMN, g_object_ref (file), IS_FOLDER_COLUMN, FALSE, -1); - set_info_for_path_at_iter (button, path, &iter); + set_info_for_file_at_iter (button, file, &iter); } else { @@ -1990,18 +1977,13 @@ model_update_current_folder (GtkFileChooserButton *button, * If we switch to a better bookmarks file format (XBEL), we * should use mime info to get a better icon. */ - label = gtk_file_system_get_bookmark_label (button->priv->fs, path); + label = gtk_file_system_get_bookmark_label (button->priv->fs, file); if (!label) - { - gchar *uri; - - uri = gtk_file_system_path_to_uri (button->priv->fs, path); - label = _gtk_file_chooser_label_for_uri (uri); - g_free (uri); - } - + label = _gtk_file_chooser_label_for_file (file); + icon_theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (button))); - if (gtk_file_system_path_is_local (button->priv->fs, path)) + + if (g_file_is_native (file)) pixbuf = gtk_icon_theme_load_icon (icon_theme, "gnome-fs-directory", button->priv->icon_size, 0, NULL); else @@ -2012,10 +1994,10 @@ model_update_current_folder (GtkFileChooserButton *button, ICON_COLUMN, pixbuf, DISPLAY_NAME_COLUMN, label, TYPE_COLUMN, ROW_TYPE_CURRENT_FOLDER, - DATA_COLUMN, gtk_file_path_copy (path), + DATA_COLUMN, g_object_ref (file), IS_FOLDER_COLUMN, TRUE, -1); - + g_free (label); g_object_unref (pixbuf); } @@ -2080,15 +2062,15 @@ model_remove_rows (GtkFileChooserButton *button, /* Filter Model */ static inline gboolean -test_if_path_is_visible (GtkFileSystem *fs, - const GtkFilePath *path, - gboolean local_only, - gboolean is_folder) +test_if_file_is_visible (GtkFileSystem *fs, + GFile *file, + gboolean local_only, + gboolean is_folder) { - if (!path) + if (!file) return FALSE; - if (local_only && !gtk_file_system_path_is_local (fs, path)) + if (local_only && !g_file_is_native (file)) return FALSE; if (!is_folder) @@ -2126,25 +2108,22 @@ filter_model_visible_func (GtkTreeModel *model, case ROW_TYPE_SPECIAL: case ROW_TYPE_SHORTCUT: case ROW_TYPE_BOOKMARK: - retval = test_if_path_is_visible (priv->fs, data, local_only, is_folder); + retval = test_if_file_is_visible (priv->fs, data, local_only, is_folder); break; case ROW_TYPE_VOLUME: { retval = TRUE; if (local_only) { - if (gtk_file_system_volume_get_is_mounted (priv->fs, data)) + if (gtk_file_system_volume_is_mounted (data)) { - GtkFilePath *base_path; - - base_path = gtk_file_system_volume_get_base_path (priv->fs, data); - if (base_path) - { - gboolean is_local = gtk_file_system_path_is_local (priv->fs, base_path); - - gtk_file_path_free (base_path); + GFile *base_file; - if (!is_local) + base_file = gtk_file_system_volume_get_root (data); + + if (base_file) + { + if (!g_file_is_native (base_file)) retval = FALSE; } else @@ -2200,13 +2179,13 @@ static void update_combo_box (GtkFileChooserButton *button) { GtkFileChooserButtonPrivate *priv = button->priv; - GSList *paths; + GSList *files; GtkTreeIter iter; gboolean row_found; gtk_tree_model_get_iter_first (priv->filter_model, &iter); - paths = _gtk_file_chooser_get_paths (GTK_FILE_CHOOSER (priv->dialog)); + files = _gtk_file_chooser_get_files (GTK_FILE_CHOOSER (priv->dialog)); row_found = FALSE; @@ -2229,21 +2208,21 @@ update_combo_box (GtkFileChooserButton *button) case ROW_TYPE_SHORTCUT: case ROW_TYPE_BOOKMARK: case ROW_TYPE_CURRENT_FOLDER: - row_found = (paths && - paths->data && - gtk_file_path_compare (data, paths->data) == 0); + row_found = (files && + files->data && + g_file_equal (data, files->data)); break; case ROW_TYPE_VOLUME: { - GtkFilePath *base_path; + GFile *base_file; - base_path = gtk_file_system_volume_get_base_path (priv->fs, data); - if (base_path) + base_file = gtk_file_system_volume_get_root (data); + if (base_file) { - row_found = (paths && - paths->data && - gtk_file_path_compare (base_path, paths->data) == 0); - gtk_file_path_free (base_path); + row_found = (files && + files->data && + g_file_equal (base_file, files->data)); + g_object_unref (base_file); } } break; @@ -2264,12 +2243,12 @@ update_combo_box (GtkFileChooserButton *button) while (!row_found && gtk_tree_model_iter_next (priv->filter_model, &iter)); /* If it hasn't been found already, update & select the current-folder row. */ - if (!row_found && paths && paths->data) + if (!row_found && files && files->data) { GtkTreeIter filter_iter; gint pos; - model_update_current_folder (button, paths->data); + model_update_current_folder (button, files->data); gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter_model)); pos = model_get_type_position (button, ROW_TYPE_CURRENT_FOLDER); @@ -2283,33 +2262,34 @@ update_combo_box (GtkFileChooserButton *button) g_signal_handler_unblock (priv->combo_box, priv->combo_box_changed_id); } - gtk_file_paths_free (paths); + g_slist_foreach (files, (GFunc) g_object_unref, NULL); + g_slist_free (files); } /* Button */ static void -update_label_get_info_cb (GtkFileSystemHandle *handle, - const GtkFileInfo *info, - const GError *error, - gpointer data) +update_label_get_info_cb (GCancellable *cancellable, + GFileInfo *info, + const GError *error, + gpointer data) { - gboolean cancelled = handle->cancelled; + gboolean cancelled = g_cancellable_is_cancelled (cancellable); GdkPixbuf *pixbuf; GtkFileChooserButton *button = data; GtkFileChooserButtonPrivate *priv = button->priv; - if (handle != priv->update_button_handle) + if (cancellable != priv->update_button_cancellable) goto out; - priv->update_button_handle = NULL; + priv->update_button_cancellable = NULL; if (cancelled || error) goto out; - gtk_label_set_text (GTK_LABEL (priv->label), gtk_file_info_get_display_name (info)); + gtk_label_set_text (GTK_LABEL (priv->label), g_file_info_get_display_name (info)); + + pixbuf = gtk_file_info_render_icon (info, GTK_WIDGET (priv->image), priv->icon_size); - pixbuf = gtk_file_info_render_icon (info, GTK_WIDGET (priv->image), - priv->icon_size, NULL); if (!pixbuf) pixbuf = gtk_icon_theme_load_icon (get_icon_theme (GTK_WIDGET (priv->image)), FALLBACK_ICON_NAME, @@ -2321,7 +2301,7 @@ update_label_get_info_cb (GtkFileSystemHandle *handle, out: g_object_unref (button); - g_object_unref (handle); + g_object_unref (cancellable); } static void @@ -2330,55 +2310,54 @@ update_label_and_image (GtkFileChooserButton *button) GtkFileChooserButtonPrivate *priv = button->priv; GdkPixbuf *pixbuf; gchar *label_text; - GSList *paths; + GSList *files; - paths = _gtk_file_chooser_get_paths (GTK_FILE_CHOOSER (priv->dialog)); + files = _gtk_file_chooser_get_files (GTK_FILE_CHOOSER (priv->dialog)); label_text = NULL; pixbuf = NULL; - if (paths && paths->data) + if (files && files->data) { - GtkFilePath *path; + GFile *file; GtkFileSystemVolume *volume = NULL; - - path = paths->data; - volume = gtk_file_system_get_volume_for_path (priv->fs, path); + file = files->data; + + volume = gtk_file_system_get_volume_for_file (priv->fs, file); if (volume) { - GtkFilePath *base_path; + GFile *base_file; - base_path = gtk_file_system_volume_get_base_path (priv->fs, volume); - if (base_path && gtk_file_path_compare (base_path, path) == 0) + base_file = gtk_file_system_volume_get_root (volume); + if (base_file && g_file_equal (base_file, file)) { - label_text = gtk_file_system_volume_get_display_name (priv->fs, - volume); - pixbuf = gtk_file_system_volume_render_icon (priv->fs, volume, + label_text = gtk_file_system_volume_get_display_name (volume); + pixbuf = gtk_file_system_volume_render_icon (volume, GTK_WIDGET (button), priv->icon_size, NULL); } - if (base_path) - gtk_file_path_free (base_path); + if (base_file) + g_object_unref (base_file); - gtk_file_system_volume_free (priv->fs, volume); + gtk_file_system_volume_free (volume); if (label_text) goto out; } - if (priv->update_button_handle) + if (priv->update_button_cancellable) { - gtk_file_system_cancel_operation (priv->update_button_handle); - priv->update_button_handle = NULL; + g_cancellable_cancel (priv->update_button_cancellable); + priv->update_button_cancellable = NULL; } - - if (gtk_file_system_path_is_local (priv->fs, path)) + + if (g_file_is_native (file)) { - priv->update_button_handle = - gtk_file_system_get_info (priv->fs, path, - GTK_FILE_INFO_DISPLAY_NAME | GTK_FILE_INFO_ICON, + priv->update_button_cancellable = + gtk_file_system_get_info (priv->fs, file, + "standard::icon,standard::display-name", update_label_get_info_cb, g_object_ref (button)); } @@ -2386,7 +2365,7 @@ update_label_and_image (GtkFileChooserButton *button) { GdkPixbuf *pixbuf; - label_text = gtk_file_system_get_bookmark_label (button->priv->fs, path); + label_text = gtk_file_system_get_bookmark_label (button->priv->fs, file); pixbuf = gtk_icon_theme_load_icon (get_icon_theme (GTK_WIDGET (priv->image)), "gnome-fs-regular", @@ -2399,7 +2378,8 @@ update_label_and_image (GtkFileChooserButton *button) } } out: - gtk_file_paths_free (paths); + g_slist_foreach (files, (GFunc) g_object_unref, NULL); + g_slist_free (files); if (label_text) { @@ -2456,7 +2436,8 @@ fs_bookmarks_changed_cb (GtkFileSystem *fs, priv->has_bookmark_separator = FALSE; priv->n_bookmarks = 0; model_add_bookmarks (user_data, bookmarks); - gtk_file_paths_free (bookmarks); + g_slist_foreach (bookmarks, (GFunc) g_object_unref, NULL); + g_slist_free (bookmarks); gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter_model)); @@ -2491,7 +2472,7 @@ open_dialog (GtkFileChooserButton *button) if (!priv->active) { - GSList *paths; + GSList *files; g_signal_handler_block (priv->dialog, priv->dialog_folder_changed_id); @@ -2499,13 +2480,14 @@ open_dialog (GtkFileChooserButton *button) priv->dialog_file_activated_id); g_signal_handler_block (priv->dialog, priv->dialog_selection_changed_id); - paths = _gtk_file_chooser_get_paths (GTK_FILE_CHOOSER (priv->dialog)); - if (paths) + files = _gtk_file_chooser_get_files (GTK_FILE_CHOOSER (priv->dialog)); + if (files) { - if (paths->data) - priv->old_path = gtk_file_path_copy (paths->data); + if (files->data) + priv->old_file = g_object_ref (files->data); - gtk_file_paths_free (paths); + g_slist_foreach (files, (GFunc) g_object_unref, NULL); + g_slist_free (files); } priv->active = TRUE; @@ -2545,20 +2527,20 @@ combo_box_changed_cb (GtkComboBox *combo_box, case ROW_TYPE_CURRENT_FOLDER: gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER (priv->dialog)); if (data) - _gtk_file_chooser_set_current_folder_path (GTK_FILE_CHOOSER (priv->dialog), + _gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (priv->dialog), data, NULL); break; case ROW_TYPE_VOLUME: { - GtkFilePath *base_path; + GFile *base_file; gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER (priv->dialog)); - base_path = gtk_file_system_volume_get_base_path (priv->fs, data); - if (base_path) + base_file = gtk_file_system_volume_get_root (data); + if (base_file) { - _gtk_file_chooser_set_current_folder_path (GTK_FILE_CHOOSER (priv->dialog), - base_path, NULL); - gtk_file_path_free (base_path); + _gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (priv->dialog), + base_file, NULL); + g_object_unref (base_file); } } break; @@ -2647,9 +2629,8 @@ dialog_notify_cb (GObject *dialog, /* If the path isn't local but we're in local-only mode now, remove * the custom-folder row */ - if (data && - (!gtk_file_system_path_is_local (priv->fs, data) && - gtk_file_chooser_get_local_only (GTK_FILE_CHOOSER (priv->dialog)))) + if (data && g_file_is_native (G_FILE (data)) && + gtk_file_chooser_get_local_only (GTK_FILE_CHOOSER (priv->dialog))) { pos--; model_remove_rows (user_data, pos, 2); @@ -2685,17 +2666,17 @@ dialog_response_cb (GtkDialog *dialog, g_signal_emit_by_name (user_data, "current-folder-changed"); g_signal_emit_by_name (user_data, "selection-changed"); } - else if (priv->old_path) + else if (priv->old_file) { switch (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog))) { case GTK_FILE_CHOOSER_ACTION_OPEN: - _gtk_file_chooser_select_path (GTK_FILE_CHOOSER (dialog), priv->old_path, + _gtk_file_chooser_select_file (GTK_FILE_CHOOSER (dialog), priv->old_file, NULL); break; case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: - _gtk_file_chooser_set_current_folder_path (GTK_FILE_CHOOSER (dialog), - priv->old_path, NULL); + _gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (dialog), + priv->old_file, NULL); break; default: g_assert_not_reached (); @@ -2705,10 +2686,10 @@ dialog_response_cb (GtkDialog *dialog, else gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER (dialog)); - if (priv->old_path) + if (priv->old_file) { - gtk_file_path_free (priv->old_path); - priv->old_path = NULL; + g_object_unref (priv->old_file); + priv->old_file = NULL; } update_label_and_image (user_data); |