diff options
-rw-r--r-- | gtk/gtkfilechooser.c | 257 | ||||
-rw-r--r-- | gtk/gtkfilechooser.h | 40 | ||||
-rw-r--r-- | gtk/gtkfilechooserdefault.c | 138 | ||||
-rw-r--r-- | gtk/gtkfilechooserentry.c | 76 | ||||
-rw-r--r-- | gtk/gtkfilechooserentry.h | 20 | ||||
-rw-r--r-- | gtk/gtkfilechooserprivate.h | 83 | ||||
-rw-r--r-- | gtk/gtkfilechooserutils.c | 69 | ||||
-rw-r--r-- | gtk/gtkfilechooserutils.h | 2 | ||||
-rw-r--r-- | gtk/gtkfilesystem.c | 171 | ||||
-rw-r--r-- | gtk/gtkfilesystem.h | 182 | ||||
-rw-r--r-- | gtk/gtkfilesystemmodel.c | 228 | ||||
-rw-r--r-- | gtk/gtkfilesystemmodel.h | 21 | ||||
-rw-r--r-- | gtk/gtkfilesystemunix.c | 238 |
13 files changed, 953 insertions, 572 deletions
diff --git a/gtk/gtkfilechooser.c b/gtk/gtkfilechooser.c index 9b075192e..77d5a2882 100644 --- a/gtk/gtkfilechooser.c +++ b/gtk/gtkfilechooser.c @@ -19,6 +19,7 @@ */ #include "gtkfilechooser.h" +#include "gtkfilechooserprivate.h" #include "gtkfilechooserenums.h" #include "gtkfilesystem.h" @@ -26,6 +27,8 @@ static void gtk_file_chooser_base_init (gpointer g_class); +static GtkFilePath *gtk_file_chooser_get_path (GtkFileChooser *chooser); + GType gtk_file_chooser_get_type (void) { @@ -212,21 +215,21 @@ gtk_file_chooser_get_select_multiple (GtkFileChooser *chooser) return select_multiple; } -char * +gchar * gtk_file_chooser_get_filename (GtkFileChooser *chooser) { - GSList *list; + GtkFileSystem *file_system; + GtkFilePath *path; gchar *result = NULL; g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL); - list = gtk_file_chooser_get_filenames (chooser); - if (list) + file_system = _gtk_file_chooser_get_file_system (chooser); + path = gtk_file_chooser_get_path (chooser); + if (path) { - result = list->data; - list = g_slist_delete_link (list, list); - g_slist_foreach (list, (GFunc)g_free, NULL); - g_slist_free (list); + result = gtk_file_system_path_to_filename (file_system, path); + gtk_file_path_free (path); } return result; @@ -234,65 +237,132 @@ gtk_file_chooser_get_filename (GtkFileChooser *chooser) void gtk_file_chooser_set_filename (GtkFileChooser *chooser, - const char *filename) + const gchar *filename) { g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + + gtk_file_chooser_unselect_all (chooser); + gtk_file_chooser_select_filename (chooser, filename); } void gtk_file_chooser_select_filename (GtkFileChooser *chooser, - const char *filename) + const gchar *filename) { + GtkFileSystem *file_system; + GtkFilePath *path; + g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + g_return_if_fail (filename != NULL); + + file_system = _gtk_file_chooser_get_file_system (chooser); + + path = gtk_file_system_filename_to_path (file_system, filename); + if (path) + { + _gtk_file_chooser_select_path (chooser, path); + gtk_file_path_free (path); + } } void gtk_file_chooser_unselect_filename (GtkFileChooser *chooser, const char *filename) { + GtkFileSystem *file_system; + GtkFilePath *path; + g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); g_return_if_fail (filename != NULL); + + file_system = _gtk_file_chooser_get_file_system (chooser); + + path = gtk_file_system_filename_to_path (file_system, filename); + if (path) + { + _gtk_file_chooser_unselect_path (chooser, path); + gtk_file_path_free (path); + } } GSList * gtk_file_chooser_get_filenames (GtkFileChooser *chooser) { + GtkFileSystem *file_system; + GSList *paths; + GSList *tmp_list; + GSList *result = NULL; + g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL); - return NULL; + file_system = _gtk_file_chooser_get_file_system (chooser); + paths = _gtk_file_chooser_get_paths (chooser); + + for (tmp_list = paths; tmp_list; tmp_list = tmp_list->next) + { + gchar *filename = gtk_file_system_path_to_filename (file_system, tmp_list->data); + if (filename) + result = g_slist_prepend (result, filename); + } + + gtk_file_paths_free (paths); + + return g_slist_reverse (result); } void gtk_file_chooser_set_current_folder (GtkFileChooser *chooser, const gchar *filename) { + GtkFileSystem *file_system; + GtkFilePath *path; + g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); g_return_if_fail (filename != NULL); + + file_system = _gtk_file_chooser_get_file_system (chooser); + + path = gtk_file_system_filename_to_path (file_system, filename); + if (path) + { + _gtk_file_chooser_set_current_folder (chooser, path); + gtk_file_path_free (path); + } } gchar * gtk_file_chooser_get_current_folder (GtkFileChooser *chooser) { + GtkFileSystem *file_system; + GtkFilePath *path; + gchar *filename; + g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL); - return NULL; + file_system = _gtk_file_chooser_get_file_system (chooser); + + path = _gtk_file_chooser_get_current_folder (chooser); + filename = gtk_file_system_path_to_filename (file_system, path); + gtk_file_path_free (path); + + return filename; } gchar * gtk_file_chooser_get_uri (GtkFileChooser *chooser) { - GSList *list; + GtkFileSystem *file_system; + GtkFilePath *path; gchar *result = NULL; g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL); - list = gtk_file_chooser_get_uris (chooser); - if (list) + file_system = _gtk_file_chooser_get_file_system (chooser); + path = gtk_file_chooser_get_path (chooser); + if (path) { - result = list->data; - list = g_slist_delete_link (list, list); - g_slist_foreach (list, (GFunc)g_free, NULL); - g_slist_free (list); + result = gtk_file_system_path_to_uri (file_system, path); + gtk_file_path_free (path); } return result; @@ -303,24 +373,49 @@ gtk_file_chooser_set_uri (GtkFileChooser *chooser, const char *uri) { g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + + gtk_file_chooser_unselect_all (chooser); + gtk_file_chooser_select_uri (chooser, uri); } void gtk_file_chooser_select_uri (GtkFileChooser *chooser, const char *uri) { - g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + GtkFileSystem *file_system; + GtkFilePath *path; - GTK_FILE_CHOOSER_GET_IFACE (chooser)->unselect_uri (chooser, uri); + g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + g_return_if_fail (uri != NULL); + + file_system = _gtk_file_chooser_get_file_system (chooser); + + path = gtk_file_system_uri_to_path (file_system, uri); + if (path) + { + _gtk_file_chooser_select_path (chooser, path); + gtk_file_path_free (path); + } } void gtk_file_chooser_unselect_uri (GtkFileChooser *chooser, const char *uri) { - g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + GtkFileSystem *file_system; + GtkFilePath *path; - GTK_FILE_CHOOSER_GET_IFACE (chooser)->unselect_uri (chooser, uri); + g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + g_return_if_fail (uri != NULL); + + file_system = _gtk_file_chooser_get_file_system (chooser); + + path = gtk_file_system_uri_to_path (file_system, uri); + if (path) + { + _gtk_file_chooser_unselect_path (chooser, path); + gtk_file_path_free (path); + } } void @@ -343,30 +438,138 @@ gtk_file_chooser_unselect_all (GtkFileChooser *chooser) GSList * gtk_file_chooser_get_uris (GtkFileChooser *chooser) { - g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL); + GtkFileSystem *file_system; + GSList *paths; + GSList *tmp_list; + GSList *result = NULL; - return GTK_FILE_CHOOSER_GET_IFACE (chooser)->get_uris (chooser); + g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL); + + file_system = _gtk_file_chooser_get_file_system (chooser); + paths = _gtk_file_chooser_get_paths (chooser); + + for (tmp_list = paths; tmp_list; tmp_list = tmp_list->next) + { + gchar *uri = gtk_file_system_path_to_uri (file_system, tmp_list->data); + if (uri) + result = g_slist_prepend (result, uri); + } + + gtk_file_paths_free (paths); + + return g_slist_reverse (result); } void gtk_file_chooser_set_current_folder_uri (GtkFileChooser *chooser, const gchar *uri) { + GtkFileSystem *file_system; + GtkFilePath *path; + g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); g_return_if_fail (uri != NULL); - return GTK_FILE_CHOOSER_GET_IFACE (chooser)->set_current_folder (chooser, uri); -} + file_system = _gtk_file_chooser_get_file_system (chooser); + path = gtk_file_system_uri_to_path (file_system, uri); + if (path) + { + _gtk_file_chooser_set_current_folder (chooser, path); + gtk_file_path_free (path); + } +} gchar * gtk_file_chooser_get_current_folder_uri (GtkFileChooser *chooser) { + GtkFileSystem *file_system; + GtkFilePath *path; + gchar *uri; + + g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL); + + file_system = _gtk_file_chooser_get_file_system (chooser); + + path = _gtk_file_chooser_get_current_folder (chooser); + uri = gtk_file_system_path_to_uri (file_system, path); + gtk_file_path_free (path); + + return uri; +} + + +void +_gtk_file_chooser_set_current_folder (GtkFileChooser *chooser, + const GtkFilePath *path) +{ + g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + g_return_if_fail (path != NULL); + + GTK_FILE_CHOOSER_GET_IFACE (chooser)->set_current_folder (chooser, path); +} + +GtkFilePath * +_gtk_file_chooser_get_current_folder (GtkFileChooser *chooser) +{ g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL); return GTK_FILE_CHOOSER_GET_IFACE (chooser)->get_current_folder (chooser); } +void +_gtk_file_chooser_select_path (GtkFileChooser *chooser, + const GtkFilePath *path) +{ + g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + + GTK_FILE_CHOOSER_GET_IFACE (chooser)->select_path (chooser, path); +} + +void +_gtk_file_chooser_unselect_path (GtkFileChooser *chooser, + const GtkFilePath *path) +{ + g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser)); + + GTK_FILE_CHOOSER_GET_IFACE (chooser)->unselect_path (chooser, path); +} + +GSList * +_gtk_file_chooser_get_paths (GtkFileChooser *chooser) +{ + g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL); + + return GTK_FILE_CHOOSER_GET_IFACE (chooser)->get_paths (chooser); +} + +static GtkFilePath * +gtk_file_chooser_get_path (GtkFileChooser *chooser) +{ + GSList *list; + GtkFilePath *result = NULL; + + g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL); + + list = _gtk_file_chooser_get_paths (chooser); + if (list) + { + result = list->data; + list = g_slist_delete_link (list, list); + gtk_file_paths_free (list); + } + + return result; +} + +GtkFileSystem * +_gtk_file_chooser_get_file_system (GtkFileChooser *chooser) +{ + g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), NULL); + + return GTK_FILE_CHOOSER_GET_IFACE (chooser)->get_file_system (chooser); +} + /* Preview widget */ void diff --git a/gtk/gtkfilechooser.h b/gtk/gtkfilechooser.h index 601bf425c..41ebc06fd 100644 --- a/gtk/gtkfilechooser.h +++ b/gtk/gtkfilechooser.h @@ -28,10 +28,8 @@ G_BEGIN_DECLS #define GTK_TYPE_FILE_CHOOSER (gtk_file_chooser_get_type ()) #define GTK_FILE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FILE_CHOOSER, GtkFileChooser)) #define GTK_IS_FILE_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FILE_CHOOSER)) -#define GTK_FILE_CHOOSER_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GTK_TYPE_FILE_CHOOSER, GtkFileChooserIface)) typedef struct _GtkFileChooser GtkFileChooser; -typedef struct _GtkFileChooserIface GtkFileChooserIface; typedef enum { @@ -39,44 +37,6 @@ typedef enum GTK_FILE_CHOOSER_ACTION_SAVE } GtkFileChooserAction; -struct _GtkFileChooserIface -{ - GTypeInterface base_iface; - - /* GtkFileChooser interface has the following properties: - * - * action: GtkFileChooserAction - * folder_mode: boolean - * select_multiple: boolean - * show_hidden: boolean - * local_only: boolean - * - * preview_widget: GtkWidget - * preview_widget_active: boolean - */ - - /* Methods - */ - void (*set_current_folder) (GtkFileChooser *chooser, - const char *uri); - char * (*get_current_folder) (GtkFileChooser *chooser); - void (*select_uri) (GtkFileChooser *chooser, - const char *uri); - void (*unselect_uri) (GtkFileChooser *chooser, - const char *uri); - void (*select_all) (GtkFileChooser *chooser); - void (*unselect_all) (GtkFileChooser *chooser); - GSList *(*get_uris) (GtkFileChooser *chooser); - - - /* Signals - */ - void (*current_folder_changed) (GtkFileChooser *chooser); - void (*selection_changed) (GtkFileChooser *chooser); - void (*update_preview) (GtkFileChooser *chooser, - const char *uri); -}; - GType gtk_file_chooser_get_type (void); /* Configuration diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index a19dbcb81..9931488ef 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -60,7 +60,7 @@ struct _GtkFileChooserImplDefault GtkFileChooserAction action; - gchar *current_folder; + GtkFilePath *current_folder; guint folder_mode : 1; guint local_only : 1; @@ -93,16 +93,17 @@ static void gtk_file_chooser_impl_default_get_property (GObject GValue *value, GParamSpec *pspec); -static void gtk_file_chooser_impl_default_set_current_folder (GtkFileChooser *chooser, - const char *uri); -static char * gtk_file_chooser_impl_default_get_current_folder (GtkFileChooser *chooser); -static void gtk_file_chooser_impl_default_select_uri (GtkFileChooser *chooser, - const char *uri); -static void gtk_file_chooser_impl_default_unselect_uri (GtkFileChooser *chooser, - const char *uri); -static void gtk_file_chooser_impl_default_select_all (GtkFileChooser *chooser); -static void gtk_file_chooser_impl_default_unselect_all (GtkFileChooser *chooser); -static GSList *gtk_file_chooser_impl_default_get_uris (GtkFileChooser *chooser); +static void gtk_file_chooser_impl_default_set_current_folder (GtkFileChooser *chooser, + const GtkFilePath *path); +static GtkFilePath * gtk_file_chooser_impl_default_get_current_folder (GtkFileChooser *chooser); +static void gtk_file_chooser_impl_default_select_path (GtkFileChooser *chooser, + const GtkFilePath *path); +static void gtk_file_chooser_impl_default_unselect_path (GtkFileChooser *chooser, + const GtkFilePath *path); +static void gtk_file_chooser_impl_default_select_all (GtkFileChooser *chooser); +static void gtk_file_chooser_impl_default_unselect_all (GtkFileChooser *chooser); +static GSList * gtk_file_chooser_impl_default_get_paths (GtkFileChooser *chooser); +static GtkFileSystem *gtk_file_chooser_impl_default_get_file_system (GtkFileChooser *chooser); static void tree_selection_changed (GtkTreeSelection *tree_selection, GtkFileChooserImplDefault *impl); @@ -182,11 +183,12 @@ gtk_file_chooser_impl_default_class_init (GtkFileChooserImplDefaultClass *class) static void gtk_file_chooser_impl_default_iface_init (GtkFileChooserIface *iface) { - iface->select_uri = gtk_file_chooser_impl_default_select_uri; - iface->unselect_uri = gtk_file_chooser_impl_default_unselect_uri; + iface->select_path = gtk_file_chooser_impl_default_select_path; + iface->unselect_path = gtk_file_chooser_impl_default_unselect_path; iface->select_all = gtk_file_chooser_impl_default_select_all; iface->unselect_all = gtk_file_chooser_impl_default_unselect_all; - iface->get_uris = gtk_file_chooser_impl_default_get_uris; + iface->get_paths = gtk_file_chooser_impl_default_get_paths; + iface->get_file_system = gtk_file_chooser_impl_default_get_file_system; iface->set_current_folder = gtk_file_chooser_impl_default_set_current_folder; iface->get_current_folder = gtk_file_chooser_impl_default_get_current_folder; } @@ -504,21 +506,21 @@ expand_and_select_func (GtkFileSystemModel *model, } static void -gtk_file_chooser_impl_default_set_current_folder (GtkFileChooser *chooser, - const char *uri) +gtk_file_chooser_impl_default_set_current_folder (GtkFileChooser *chooser, + const GtkFilePath *path) { GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser); - _gtk_file_system_model_uri_do (impl->tree_model, uri, - expand_and_select_func, impl); + _gtk_file_system_model_path_do (impl->tree_model, path, + expand_and_select_func, impl); } -static char * +static GtkFilePath * gtk_file_chooser_impl_default_get_current_folder (GtkFileChooser *chooser) { GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser); - return g_strdup (impl->current_folder); + return gtk_file_path_copy (impl->current_folder); } static void @@ -538,24 +540,24 @@ select_func (GtkFileSystemModel *model, } static void -gtk_file_chooser_impl_default_select_uri (GtkFileChooser *chooser, - const char *uri) +gtk_file_chooser_impl_default_select_path (GtkFileChooser *chooser, + const GtkFilePath *path) { GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser); - gchar *parent_uri; + GtkFilePath *parent_path; - if (!gtk_file_system_get_parent (impl->file_system, uri, &parent_uri, NULL)) /* NULL-GError */ + if (!gtk_file_system_get_parent (impl->file_system, path, &parent_path, NULL)) /* NULL-GError */ return; - if (!parent_uri) + if (!parent_path) { - gtk_file_chooser_set_current_folder_uri (chooser, uri); + _gtk_file_chooser_set_current_folder (chooser, path); } else { - gtk_file_chooser_set_current_folder_uri (chooser, parent_uri); - g_free (parent_uri); - _gtk_file_system_model_uri_do (impl->list_model, uri, + _gtk_file_chooser_set_current_folder (chooser, parent_path); + gtk_file_path_free (parent_path); + _gtk_file_system_model_path_do (impl->list_model, path, select_func, impl); } } @@ -578,12 +580,12 @@ unselect_func (GtkFileSystemModel *model, } static void -gtk_file_chooser_impl_default_unselect_uri (GtkFileChooser *chooser, - const char *uri) +gtk_file_chooser_impl_default_unselect_path (GtkFileChooser *chooser, + const GtkFilePath *path) { GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser); - _gtk_file_system_model_uri_do (impl->list_model, uri, + _gtk_file_system_model_path_do (impl->list_model, path, unselect_func, impl); } @@ -608,14 +610,14 @@ gtk_file_chooser_impl_default_unselect_all (GtkFileChooser *chooser) } static void -get_uris_foreach (GtkTreeModel *model, - GtkTreePath *path, - GtkTreeIter *iter, - gpointer data) +get_paths_foreach (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) { GtkTreePath *child_path; GtkTreeIter child_iter; - const gchar *uri; + const GtkFilePath *file_path; struct { GSList *result; @@ -626,12 +628,12 @@ get_uris_foreach (GtkTreeModel *model, gtk_tree_model_get_iter (GTK_TREE_MODEL (info->impl->list_model), &child_iter, child_path); gtk_tree_path_free (child_path); - uri = _gtk_file_system_model_get_uri (info->impl->tree_model, &child_iter); - info->result = g_slist_prepend (info->result, g_strdup (uri)); + file_path = _gtk_file_system_model_get_path (info->impl->tree_model, &child_iter); + info->result = g_slist_prepend (info->result, gtk_file_path_copy (file_path)); } static GSList * -gtk_file_chooser_impl_default_get_uris (GtkFileChooser *chooser) +gtk_file_chooser_impl_default_get_paths (GtkFileChooser *chooser) { GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser); GtkTreeSelection *selection; @@ -648,10 +650,18 @@ gtk_file_chooser_impl_default_get_uris (GtkFileChooser *chooser) info.impl = impl; gtk_tree_selection_selected_foreach (selection, - get_uris_foreach, &info); + get_paths_foreach, &info); return g_slist_reverse (info.result); } +static GtkFileSystem * +gtk_file_chooser_impl_default_get_file_system (GtkFileChooser *chooser) +{ + GtkFileChooserImplDefault *impl = GTK_FILE_CHOOSER_IMPL_DEFAULT (chooser); + + return impl->file_system; +} + static gint name_sort_func (GtkTreeModel *model, GtkTreeIter *a, @@ -763,20 +773,20 @@ tree_selection_changed (GtkTreeSelection *selection, GtkFileChooserImplDefault *impl) { GtkTreeIter iter; - const gchar *uri; + const GtkFilePath *file_path; GtkTreePath *path; if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) return; - uri = _gtk_file_system_model_get_uri (impl->tree_model, &iter); - if (impl->current_folder && strcmp (uri, impl->current_folder) == 0) + file_path = _gtk_file_system_model_get_path (impl->tree_model, &iter); + if (impl->current_folder && gtk_file_path_compare (file_path, impl->current_folder) == 0) return; if (impl->current_folder) - g_free (impl->current_folder); - impl->current_folder = g_strdup (uri); - _gtk_file_chooser_entry_set_base_folder (GTK_FILE_CHOOSER_ENTRY (impl->entry), uri); + gtk_file_path_free (impl->current_folder); + impl->current_folder = gtk_file_path_copy (file_path); + _gtk_file_chooser_entry_set_base_folder (GTK_FILE_CHOOSER_ENTRY (impl->entry), file_path); if (impl->list_model) { @@ -796,10 +806,10 @@ tree_selection_changed (GtkTreeSelection *selection, /* Now update the list view to show the new row. */ - uri = _gtk_file_system_model_get_uri (impl->tree_model, &iter); + file_path = _gtk_file_system_model_get_path (impl->tree_model, &iter); impl->list_model = _gtk_file_system_model_new (impl->file_system, - uri, 0, + file_path, 0, GTK_FILE_INFO_DISPLAY_NAME | GTK_FILE_INFO_SIZE); _gtk_file_system_model_set_show_folders (impl->list_model, FALSE); @@ -837,46 +847,46 @@ entry_activate (GtkEntry *entry, GtkFileChooserImplDefault *impl) { GtkFileChooserEntry *chooser_entry = GTK_FILE_CHOOSER_ENTRY (entry); - const gchar *folder_uri = _gtk_file_chooser_entry_get_current_folder (chooser_entry); + const GtkFilePath *folder_path = _gtk_file_chooser_entry_get_current_folder (chooser_entry); const gchar *file_part = _gtk_file_chooser_entry_get_file_part (chooser_entry); - gchar *new_folder = NULL; + GtkFilePath *new_folder = NULL; /* If the file part is non-empty, we need to figure out if it * refers to a folder within folder. We could optimize the case * here where the folder is already loaded for one of our tree models. */ - if (file_part[0] == '\0' && strcmp (impl->current_folder, folder_uri) != 0) - new_folder = g_strdup (folder_uri); + if (file_part[0] == '\0' && gtk_file_path_compare (impl->current_folder, folder_path) != 0) + new_folder = gtk_file_path_copy (folder_path); else { GtkFileFolder *folder = NULL; - gchar *subfolder_uri = NULL; + GtkFilePath *subfolder_path = NULL; GtkFileInfo *info = NULL; folder = gtk_file_system_get_folder (impl->file_system, - folder_uri, + folder_path, GTK_FILE_INFO_IS_FOLDER, NULL); /* NULL-GError */ if (folder) - subfolder_uri = gtk_file_system_make_uri (impl->file_system, - folder_uri, + subfolder_path = gtk_file_system_make_path (impl->file_system, + folder_path, file_part, NULL); /* NULL-GError */ - if (subfolder_uri) + if (subfolder_path) info = gtk_file_folder_get_info (folder, - subfolder_uri, + subfolder_path, NULL); /* NULL-GError */ if (info && gtk_file_info_get_is_folder (info)) - new_folder = g_strdup (subfolder_uri); + new_folder = gtk_file_path_copy (subfolder_path); if (folder) g_object_unref (folder); - if (subfolder_uri) - g_free (subfolder_uri); + if (subfolder_path) + gtk_file_path_free (subfolder_path); if (info) gtk_file_info_free (info); @@ -886,10 +896,10 @@ entry_activate (GtkEntry *entry, { g_signal_stop_emission_by_name (entry, "activate"); - gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (impl), new_folder); + _gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (impl), new_folder); _gtk_file_chooser_entry_set_file_part (chooser_entry, ""); - g_free (new_folder); + gtk_file_path_free (new_folder); } } diff --git a/gtk/gtkfilechooserentry.c b/gtk/gtkfilechooserentry.c index c1af383ee..ff3d7baee 100644 --- a/gtk/gtkfilechooserentry.c +++ b/gtk/gtkfilechooserentry.c @@ -40,8 +40,8 @@ struct _GtkFileChooserEntry GtkEntry parent_instance; GtkFileSystem *file_system; - gchar *base_folder; - gchar *current_folder_uri; + GtkFilePath *base_folder; + GtkFilePath *current_folder_path; gchar *file_part; GSource *completion_idle; @@ -151,8 +151,8 @@ gtk_file_chooser_entry_finalize (GObject *object) if (chooser_entry->file_system) g_object_unref (chooser_entry->file_system); - g_free (chooser_entry->base_folder); - g_free (chooser_entry->current_folder_uri); + gtk_file_path_free (chooser_entry->base_folder); + gtk_file_path_free (chooser_entry->current_folder_path); g_free (chooser_entry->file_part); parent_class->finalize (object); @@ -162,26 +162,26 @@ static gboolean completion_idle_callback (GtkFileChooserEntry *chooser_entry) { GtkEditable *editable = GTK_EDITABLE (chooser_entry); - GSList *child_uris = NULL; + GSList *child_paths = NULL; GSList *tmp_list; gchar *common_prefix = NULL; - gchar *unique_uri = NULL; + GtkFilePath *unique_path = NULL; chooser_entry->completion_idle = NULL; if (!chooser_entry->current_folder && chooser_entry->file_system && - chooser_entry->current_folder_uri) + chooser_entry->current_folder_path) chooser_entry->current_folder = gtk_file_system_get_folder (chooser_entry->file_system, - chooser_entry->current_folder_uri, + chooser_entry->current_folder_path, GTK_FILE_INFO_DISPLAY_NAME | GTK_FILE_INFO_IS_FOLDER, NULL); /* NULL-GError */ if (chooser_entry->current_folder) gtk_file_folder_list_children (chooser_entry->current_folder, - &child_uris, + &child_paths, NULL); /* NULL-GError */ - for (tmp_list = child_uris; tmp_list; tmp_list = tmp_list->next) + for (tmp_list = child_paths; tmp_list; tmp_list = tmp_list->next) { GtkFileInfo *info; @@ -197,7 +197,7 @@ completion_idle_callback (GtkFileChooserEntry *chooser_entry) if (!common_prefix) { common_prefix = g_strdup (display_name); - unique_uri = g_strdup (tmp_list->data); + unique_path = gtk_file_path_copy (tmp_list->data); } else { @@ -212,8 +212,8 @@ completion_idle_callback (GtkFileChooserEntry *chooser_entry) *p = '\0'; - g_free (unique_uri); - unique_uri = NULL; + gtk_file_path_free (unique_path); + unique_path = NULL; } } @@ -221,12 +221,12 @@ completion_idle_callback (GtkFileChooserEntry *chooser_entry) } } - if (unique_uri) + if (unique_path) { GtkFileInfo *info; info = gtk_file_folder_get_info (chooser_entry->current_folder, - unique_uri, + unique_path, NULL); /* NULL-GError */ if (info) @@ -241,11 +241,11 @@ completion_idle_callback (GtkFileChooserEntry *chooser_entry) gtk_file_info_free (info); } - g_free (unique_uri); + gtk_file_path_free (unique_path); } - g_slist_foreach (child_uris, (GFunc)g_free, NULL); - g_slist_free (child_uris); + gtk_file_paths_free (child_paths); + g_slist_free (child_paths); if (common_prefix) { @@ -328,7 +328,7 @@ gtk_file_chooser_entry_changed (GtkEditable *editable) { GtkFileChooserEntry *chooser_entry = GTK_FILE_CHOOSER_ENTRY (editable); const gchar *text; - gchar *folder_uri; + GtkFilePath *folder_path; gchar *file_part; text = gtk_entry_get_text (GTK_ENTRY (editable)); @@ -337,25 +337,27 @@ gtk_file_chooser_entry_changed (GtkEditable *editable) !chooser_entry->base_folder || !gtk_file_system_parse (chooser_entry->file_system, chooser_entry->base_folder, text, - &folder_uri, &file_part, NULL)) /* NULL-GError */ + &folder_path, &file_part, NULL)) /* NULL-GError */ { - folder_uri = g_strdup (chooser_entry->base_folder); + folder_path = gtk_file_path_copy (chooser_entry->base_folder); file_part = g_strdup (""); } - if (chooser_entry->current_folder_uri && - strcmp (folder_uri, chooser_entry->current_folder_uri) != 0) + if (chooser_entry->current_folder_path) { - if (chooser_entry->current_folder_uri) - g_free (chooser_entry->current_folder_uri); - if (chooser_entry->current_folder) + if (gtk_file_path_compare (folder_path, chooser_entry->current_folder_path) != 0) { - g_object_unref (chooser_entry->current_folder); - chooser_entry->current_folder = NULL; + if (chooser_entry->current_folder) + { + g_object_unref (chooser_entry->current_folder); + chooser_entry->current_folder = NULL; + } } + + gtk_file_path_free (chooser_entry->current_folder_path); } - chooser_entry->current_folder_uri = folder_uri; + chooser_entry->current_folder_path = folder_path; if (chooser_entry->file_part) g_free (chooser_entry->file_part); @@ -412,18 +414,18 @@ _gtk_file_chooser_entry_set_file_system (GtkFileChooserEntry *chooser_entry, /** * _gtk_file_chooser_entry_set_base_folder: * @chooser_entry: a #GtkFileChooserEntry - * @uri: URI of a folder in the chooser entries current file system. + * @path: path of a folder in the chooser entries current file system. * * Sets the folder with respect to which completions occur. **/ void _gtk_file_chooser_entry_set_base_folder (GtkFileChooserEntry *chooser_entry, - const gchar *uri) + const GtkFilePath *path) { if (chooser_entry->base_folder) - g_free (chooser_entry->base_folder); + gtk_file_path_free (chooser_entry->base_folder); - chooser_entry->base_folder = g_strdup (uri); + chooser_entry->base_folder = gtk_file_path_copy (path); } /** @@ -438,13 +440,13 @@ _gtk_file_chooser_entry_set_base_folder (GtkFileChooserEntry *chooser_entry, * path that doesn't point to a folder in the file system, it will * be %NULL. * - * Return value: the URI of current folder - this value is owned by the + * Return value: the path of current folder - this value is owned by the * chooser entry and must not be modified or freed. **/ -const gchar * +const GtkFilePath * _gtk_file_chooser_entry_get_current_folder (GtkFileChooserEntry *chooser_entry) { - return chooser_entry->current_folder_uri; + return chooser_entry->current_folder_path; } /** @@ -453,7 +455,7 @@ _gtk_file_chooser_entry_get_current_folder (GtkFileChooserEntry *chooser_entry) * * Gets the non-folder portion of whatever the user has entered * into the file selector. What is returned is a UTF-8 string, - * and if a filename URI is needed, gtk_file_system_make_uri() + * and if a filename path is needed, gtk_file_system_make_path() * must be used * * Return value: the entered filename - this value is owned by the diff --git a/gtk/gtkfilechooserentry.h b/gtk/gtkfilechooserentry.h index 866f72500..6c960b5bf 100644 --- a/gtk/gtkfilechooserentry.h +++ b/gtk/gtkfilechooserentry.h @@ -32,16 +32,16 @@ G_BEGIN_DECLS typedef struct _GtkFileChooserEntry GtkFileChooserEntry; -GType _gtk_file_chooser_entry_get_type (void); -GtkWidget * _gtk_file_chooser_entry_new (void); -void _gtk_file_chooser_entry_set_file_system (GtkFileChooserEntry *chooser_entry, - GtkFileSystem *file_system); -void _gtk_file_chooser_entry_set_base_folder (GtkFileChooserEntry *chooser_entry, - const gchar *uri); -void _gtk_file_chooser_entry_set_file_part (GtkFileChooserEntry *chooser_entry, - const gchar *file_part); -const gchar *_gtk_file_chooser_entry_get_current_folder (GtkFileChooserEntry *chooser_entry); -const gchar *_gtk_file_chooser_entry_get_file_part (GtkFileChooserEntry *chooser_entry); +GType _gtk_file_chooser_entry_get_type (void); +GtkWidget * _gtk_file_chooser_entry_new (void); +void _gtk_file_chooser_entry_set_file_system (GtkFileChooserEntry *chooser_entry, + GtkFileSystem *file_system); +void _gtk_file_chooser_entry_set_base_folder (GtkFileChooserEntry *chooser_entry, + const GtkFilePath *path); +void _gtk_file_chooser_entry_set_file_part (GtkFileChooserEntry *chooser_entry, + const gchar *file_part); +const GtkFilePath *_gtk_file_chooser_entry_get_current_folder (GtkFileChooserEntry *chooser_entry); +const gchar * _gtk_file_chooser_entry_get_file_part (GtkFileChooserEntry *chooser_entry); G_END_DECLS diff --git a/gtk/gtkfilechooserprivate.h b/gtk/gtkfilechooserprivate.h new file mode 100644 index 000000000..ddbe16c32 --- /dev/null +++ b/gtk/gtkfilechooserprivate.h @@ -0,0 +1,83 @@ +/* GTK - The GIMP Toolkit + * gtkfilechooserprivate.h: Interface definition for file selector GUIs + * Copyright (C) 2003, Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GTK_FILE_CHOOSER_PRIVATE_H__ +#define __GTK_FILE_CHOOSER_PRIVATE_H__ + +#include "gtkfilechooser.h" +#include "gtkfilesystem.h" + +G_BEGIN_DECLS + +#define GTK_FILE_CHOOSER_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GTK_TYPE_FILE_CHOOSER, GtkFileChooserIface)) + +typedef struct _GtkFileChooserIface GtkFileChooserIface; + +struct _GtkFileChooserIface +{ + GTypeInterface base_iface; + + /* GtkFileChooser interface has the following properties: + * + * action: GtkFileChooserAction + * folder_mode: boolean + * select_multiple: boolean + * show_hidden: boolean + * local_only: boolean + * + * preview_widget: GtkWidget + * preview_widget_active: boolean + */ + + /* Methods + */ + void (*set_current_folder) (GtkFileChooser *chooser, + const GtkFilePath *path); + GtkFilePath * (*get_current_folder) (GtkFileChooser *chooser); + void (*select_path) (GtkFileChooser *chooser, + const GtkFilePath *path); + void (*unselect_path) (GtkFileChooser *chooser, + const GtkFilePath *path); + void (*select_all) (GtkFileChooser *chooser); + void (*unselect_all) (GtkFileChooser *chooser); + GSList * (*get_paths) (GtkFileChooser *chooser); + GtkFileSystem *(*get_file_system) (GtkFileChooser *chooser); + + /* Signals + */ + void (*current_folder_changed) (GtkFileChooser *chooser); + void (*selection_changed) (GtkFileChooser *chooser); + void (*update_preview) (GtkFileChooser *chooser, + const gchar *uri); +}; + +GtkFileSystem *_gtk_file_chooser_get_file_system (GtkFileChooser *chooser); +void _gtk_file_chooser_set_current_folder (GtkFileChooser *chooser, + const GtkFilePath *path); +GtkFilePath * _gtk_file_chooser_get_current_folder (GtkFileChooser *chooser); +void _gtk_file_chooser_select_path (GtkFileChooser *chooser, + const GtkFilePath *path); +void _gtk_file_chooser_unselect_path (GtkFileChooser *chooser, + const GtkFilePath *path); +GSList * _gtk_file_chooser_get_paths (GtkFileChooser *chooser); + +G_END_DECLS + +#endif /* __GTK_FILE_CHOOSER_PRIVATE_H__ */ diff --git a/gtk/gtkfilechooserutils.c b/gtk/gtkfilechooserutils.c index 08992c872..9a09eecb9 100644 --- a/gtk/gtkfilechooserutils.c +++ b/gtk/gtkfilechooserutils.c @@ -24,21 +24,21 @@ #include "gtkfilechooserenums.h" #include "gtkfilesystem.h" -static void delegate_set_current_folder (GtkFileChooser *chooser, - const char *uri); -static char * delegate_get_current_folder (GtkFileChooser *chooser); -static void delegate_select_uri (GtkFileChooser *chooser, - const char *uri); -static void delegate_unselect_uri (GtkFileChooser *chooser, - const char *uri); -static void delegate_select_all (GtkFileChooser *chooser); -static void delegate_unselect_all (GtkFileChooser *chooser); -static GSList *delegate_get_uris (GtkFileChooser *chooser); - -static void delegate_current_folder_changed (GtkFileChooser *chooser, - gpointer data); -static void delegate_selection_changed (GtkFileChooser *chooser, - gpointer data); +static void delegate_set_current_folder (GtkFileChooser *chooser, + const GtkFilePath *path); +static GtkFilePath * delegate_get_current_folder (GtkFileChooser *chooser); +static void delegate_select_path (GtkFileChooser *chooser, + const GtkFilePath *path); +static void delegate_unselect_path (GtkFileChooser *chooser, + const GtkFilePath *path); +static void delegate_select_all (GtkFileChooser *chooser); +static void delegate_unselect_all (GtkFileChooser *chooser); +static GSList * delegate_get_paths (GtkFileChooser *chooser); +static GtkFileSystem *delegate_get_file_system (GtkFileChooser *chooser); +static void delegate_current_folder_changed (GtkFileChooser *chooser, + gpointer data); +static void delegate_selection_changed (GtkFileChooser *chooser, + gpointer data); /** * _gtk_file_chooser_install_properties: @@ -112,11 +112,12 @@ _gtk_file_chooser_delegate_iface_init (GtkFileChooserIface *iface) { iface->set_current_folder = delegate_set_current_folder; iface->get_current_folder = delegate_get_current_folder; - iface->select_uri = delegate_select_uri; - iface->unselect_uri = delegate_unselect_uri; + iface->select_path = delegate_select_path; + iface->unselect_path = delegate_unselect_path; iface->select_all = delegate_select_all; iface->unselect_all = delegate_unselect_all; - iface->get_uris = delegate_get_uris; + iface->get_paths = delegate_get_paths; + iface->get_file_system = delegate_get_file_system; } /** @@ -152,17 +153,17 @@ get_delegate (GtkFileChooser *receiver) } static void -delegate_select_uri (GtkFileChooser *chooser, - const char *uri) +delegate_select_path (GtkFileChooser *chooser, + const GtkFilePath *path) { - gtk_file_chooser_select_uri (get_delegate (chooser), uri); + _gtk_file_chooser_select_path (get_delegate (chooser), path); } static void -delegate_unselect_uri (GtkFileChooser *chooser, - const char *uri) +delegate_unselect_path (GtkFileChooser *chooser, + const GtkFilePath *path) { - gtk_file_chooser_unselect_uri (get_delegate (chooser), uri); + _gtk_file_chooser_unselect_path (get_delegate (chooser), path); } static void @@ -178,22 +179,28 @@ delegate_unselect_all (GtkFileChooser *chooser) } static GSList * -delegate_get_uris (GtkFileChooser *chooser) +delegate_get_paths (GtkFileChooser *chooser) { - return gtk_file_chooser_get_uris (get_delegate (chooser)); + return _gtk_file_chooser_get_paths (get_delegate (chooser)); +} + +static GtkFileSystem * +delegate_get_file_system (GtkFileChooser *chooser) +{ + return _gtk_file_chooser_get_file_system (get_delegate (chooser)); } static void -delegate_set_current_folder (GtkFileChooser *chooser, - const char *uri) +delegate_set_current_folder (GtkFileChooser *chooser, + const GtkFilePath *path) { - gtk_file_chooser_set_current_folder_uri (chooser, uri); + _gtk_file_chooser_set_current_folder (chooser, path); } -static char * +static GtkFilePath * delegate_get_current_folder (GtkFileChooser *chooser) { - return gtk_file_chooser_get_current_folder_uri (get_delegate (chooser)); + return _gtk_file_chooser_get_current_folder (get_delegate (chooser)); } static void diff --git a/gtk/gtkfilechooserutils.h b/gtk/gtkfilechooserutils.h index a6763bf5c..56e47d55d 100644 --- a/gtk/gtkfilechooserutils.h +++ b/gtk/gtkfilechooserutils.h @@ -22,7 +22,7 @@ #ifndef __GTK_FILE_CHOOSER_UTILS_H__ #define __GTK_FILE_CHOOSER_UTILS_H__ -#include "gtkfilechooser.h" +#include "gtkfilechooserprivate.h" G_BEGIN_DECLS diff --git a/gtk/gtkfilesystem.c b/gtk/gtkfilesystem.c index 1ec3cf29a..1c50ac2c8 100644 --- a/gtk/gtkfilesystem.c +++ b/gtk/gtkfilesystem.c @@ -20,6 +20,8 @@ #include "gtkfilesystem.h" +#include <string.h> + struct _GtkFileInfo { GtkFileTime modification_time; @@ -326,85 +328,85 @@ gtk_file_system_list_roots (GtkFileSystem *file_system) } GtkFileInfo * -gtk_file_system_get_root_info (GtkFileSystem *file_system, - const gchar *uri, - GtkFileInfoType types, - GError **error) +gtk_file_system_get_root_info (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFileInfoType types, + GError **error) { g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL); - g_return_val_if_fail (uri != NULL, NULL); + g_return_val_if_fail (path != NULL, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); - return GTK_FILE_SYSTEM_GET_IFACE (file_system)->get_root_info (file_system, uri, types, error); + return GTK_FILE_SYSTEM_GET_IFACE (file_system)->get_root_info (file_system, path, types, error); } GtkFileFolder * -gtk_file_system_get_folder (GtkFileSystem *file_system, - const gchar *uri, - GtkFileInfoType types, - GError **error) +gtk_file_system_get_folder (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFileInfoType types, + GError **error) { g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL); - g_return_val_if_fail (uri != NULL, NULL); + g_return_val_if_fail (path != NULL, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); - return GTK_FILE_SYSTEM_GET_IFACE (file_system)->get_folder (file_system, uri, types, error); + return GTK_FILE_SYSTEM_GET_IFACE (file_system)->get_folder (file_system, path, types, error); } gboolean -gtk_file_system_create_folder(GtkFileSystem *file_system, - const gchar *uri, - GError **error) +gtk_file_system_create_folder(GtkFileSystem *file_system, + const GtkFilePath *path, + GError **error) { g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), FALSE); - g_return_val_if_fail (uri != NULL, FALSE); + g_return_val_if_fail (path != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - return GTK_FILE_SYSTEM_GET_IFACE (file_system)->create_folder (file_system, uri, error); + return GTK_FILE_SYSTEM_GET_IFACE (file_system)->create_folder (file_system, path, error); } gboolean -gtk_file_system_get_parent (GtkFileSystem *file_system, - const gchar *uri, - gchar **parent, - GError **error) +gtk_file_system_get_parent (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFilePath **parent, + GError **error) { - gchar *tmp_parent = NULL; + GtkFilePath *tmp_parent = NULL; gboolean result; g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), FALSE); - g_return_val_if_fail (uri != NULL, FALSE); + g_return_val_if_fail (path != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - result = GTK_FILE_SYSTEM_GET_IFACE (file_system)->get_parent (file_system, uri, &tmp_parent, error); + result = GTK_FILE_SYSTEM_GET_IFACE (file_system)->get_parent (file_system, path, &tmp_parent, error); g_assert (result || tmp_parent == NULL); if (parent) *parent = tmp_parent; else - g_free (tmp_parent); + gtk_file_path_free (tmp_parent); return result; } -gchar * -gtk_file_system_make_uri (GtkFileSystem *file_system, - const gchar *base_uri, - const gchar *display_name, - GError **error) +GtkFilePath * +gtk_file_system_make_path (GtkFileSystem *file_system, + const GtkFilePath *base_path, + const gchar *display_name, + GError **error) { g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL); - g_return_val_if_fail (base_uri != NULL, NULL); + g_return_val_if_fail (base_path != NULL, NULL); g_return_val_if_fail (display_name != NULL, NULL); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - return GTK_FILE_SYSTEM_GET_IFACE (file_system)->make_uri (file_system, base_uri, display_name, error); + return GTK_FILE_SYSTEM_GET_IFACE (file_system)->make_path (file_system, base_path, display_name, error); } /** * gtk_file_system_parse: * @file_system: a #GtkFileSystem - * @base_uri: reference folder with respect to which relative + * @base_path: reference folder with respect to which relative * paths should be interpreted. * @str: the string to parse * @folder: location to store folder portion of result, or %NULL @@ -412,8 +414,8 @@ gtk_file_system_make_uri (GtkFileSystem *file_system, * @error: location to store error, or %NULL * * Given a string entered by a user, parse it (possibly using - * heuristics) into a folder URI and a UTF-8 encoded - * filename part. (Suitable for passing to gtk_file_system_make_uri()) + * heuristics) into a folder path and a UTF-8 encoded + * filename part. (Suitable for passing to gtk_file_system_make_path()) * * Note that the returned filename point may point to a subfolder * of the returned folder. Adding a trailing path separator is needed @@ -433,31 +435,31 @@ gtk_file_system_make_uri (GtkFileSystem *file_system, * Return value: %TRUE if the parsing succeeds, otherwise, %FALSE. **/ gboolean -gtk_file_system_parse (GtkFileSystem *file_system, - const gchar *base_uri, - const gchar *str, - gchar **folder, - gchar **file_part, - GError **error) -{ - gchar *tmp_folder = NULL; +gtk_file_system_parse (GtkFileSystem *file_system, + const GtkFilePath *base_path, + const gchar *str, + GtkFilePath **folder, + gchar **file_part, + GError **error) +{ + GtkFilePath *tmp_folder = NULL; gchar *tmp_file_part = NULL; gboolean result; g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), FALSE); - g_return_val_if_fail (base_uri != NULL, FALSE); + g_return_val_if_fail (base_path != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - result = GTK_FILE_SYSTEM_GET_IFACE (file_system)->parse (file_system, base_uri, str, - &tmp_folder, &tmp_file_part, - error); + result = GTK_FILE_SYSTEM_GET_IFACE (file_system)->parse (file_system, base_path, str, + &tmp_folder, &tmp_file_part, + error); g_assert (result || (tmp_folder == NULL && tmp_file_part == NULL)); if (folder) *folder = tmp_folder; else - g_free (tmp_folder); + gtk_file_path_free (tmp_folder); if (file_part) *file_part = tmp_file_part; @@ -467,6 +469,47 @@ gtk_file_system_parse (GtkFileSystem *file_system, return result; } + +gchar * +gtk_file_system_path_to_uri (GtkFileSystem *file_system, + const GtkFilePath *path) +{ + g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL); + g_return_val_if_fail (path != NULL, NULL); + + return GTK_FILE_SYSTEM_GET_IFACE (file_system)->path_to_uri (file_system, path); +} + +gchar * +gtk_file_system_path_to_filename (GtkFileSystem *file_system, + const GtkFilePath *path) +{ + g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL); + g_return_val_if_fail (path != NULL, NULL); + + return GTK_FILE_SYSTEM_GET_IFACE (file_system)->path_to_filename (file_system, path); +} + +GtkFilePath * +gtk_file_system_uri_to_path (GtkFileSystem *file_system, + const gchar *uri) +{ + g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL); + g_return_val_if_fail (uri != NULL, NULL); + + return GTK_FILE_SYSTEM_GET_IFACE (file_system)->uri_to_path (file_system, uri); +} + +GtkFilePath * +gtk_file_system_filename_to_path (GtkFileSystem *file_system, + const gchar *filename) +{ + g_return_val_if_fail (GTK_IS_FILE_SYSTEM (file_system), NULL); + g_return_val_if_fail (filename != NULL, NULL); + + return GTK_FILE_SYSTEM_GET_IFACE (file_system)->filename_to_path (file_system, filename); +} + /***************************************** * GtkFileFolder * *****************************************/ @@ -556,22 +599,36 @@ gtk_file_folder_list_children (GtkFileFolder *folder, if (children) *children = tmp_children; else - { - g_slist_foreach (tmp_children, (GFunc)g_free, NULL); - g_slist_free (tmp_children); - } + gtk_file_paths_free (tmp_children); return result; } GtkFileInfo * -gtk_file_folder_get_info (GtkFileFolder *folder, - const gchar *uri, - GError **error) +gtk_file_folder_get_info (GtkFileFolder *folder, + const GtkFilePath *path, + GError **error) { g_return_val_if_fail (GTK_IS_FILE_FOLDER (folder), NULL); - g_return_val_if_fail (uri != NULL, NULL); + g_return_val_if_fail (path != NULL, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); - return GTK_FILE_FOLDER_GET_IFACE (folder)->get_info (folder, uri, error); + return GTK_FILE_FOLDER_GET_IFACE (folder)->get_info (folder, path, error); +} + +GSList * +gtk_file_paths_sort (GSList *paths) +{ + return g_slist_sort (paths, (GCompareFunc)strcmp); +} + +void +gtk_file_paths_free (GSList *paths) +{ + GSList *tmp_list; + + for (tmp_list = paths; tmp_list; tmp_list = tmp_list->next) + gtk_file_path_free (tmp_list->data); + + g_slist_free (paths); } diff --git a/gtk/gtkfilesystem.h b/gtk/gtkfilesystem.h index 791cbd671..be8d46022 100644 --- a/gtk/gtkfilesystem.h +++ b/gtk/gtkfilesystem.h @@ -34,6 +34,8 @@ typedef struct _GtkFileInfo GtkFileInfo; typedef struct _GtkFileSystem GtkFileSystem; typedef struct _GtkFileSystemIface GtkFileSystemIface; +typedef struct _GtkFilePath GtkFilePath; + /* Mask of information about a file, for monitoring and * gtk_file_system_get_info() */ @@ -110,37 +112,46 @@ struct _GtkFileSystemIface /* Methods */ - GSList * (*list_roots) (GtkFileSystem *file_system); + GSList * (*list_roots) (GtkFileSystem *file_system); - GtkFileInfo * (*get_root_info) (GtkFileSystem *file_system, - const gchar *uri, - GtkFileInfoType types, - GError **error); + GtkFileInfo * (*get_root_info) (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFileInfoType types, + GError **error); - GtkFileFolder * (*get_folder) (GtkFileSystem *file_system, - const gchar *uri, - GtkFileInfoType types, - GError **error); - gboolean (*create_folder) (GtkFileSystem *file_system, - const gchar *uri, - GError **error); - - /* URI Manipulation + GtkFileFolder * (*get_folder) (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFileInfoType types, + GError **error); + gboolean (*create_folder) (GtkFileSystem *file_system, + const GtkFilePath *path, + GError **error); + + /* Path Manipulation */ - gboolean (*get_parent) (GtkFileSystem *file_system, - const gchar *uri, - gchar **parent, - GError **error); - gchar * (*make_uri) (GtkFileSystem *file_system, - const gchar *base_uri, - const gchar *display_name, - GError **error); - gboolean (*parse) (GtkFileSystem *file_system, - const gchar *base_uri, - const gchar *str, - gchar **folder, - gchar **file_part, - GError **error); + gboolean (*get_parent) (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFilePath **parent, + GError **error); + GtkFilePath * (*make_path) (GtkFileSystem *file_system, + const GtkFilePath *base_path, + const gchar *display_name, + GError **error); + gboolean (*parse) (GtkFileSystem *file_system, + const GtkFilePath *base_path, + const gchar *str, + GtkFilePath **folder, + gchar **file_part, + GError **error); + gchar * (*path_to_uri) (GtkFileSystem *file_system, + const GtkFilePath *path); + gchar * (*path_to_filename) (GtkFileSystem *file_system, + const GtkFilePath *path); + GtkFilePath *(*uri_to_path) (GtkFileSystem *file_system, + const gchar *uri); + GtkFilePath *(*filename_to_path) (GtkFileSystem *file_system, + const gchar *path); + /* Signals */ void (*roots_changed) (GtkFileSystem *file_system); @@ -148,33 +159,43 @@ struct _GtkFileSystemIface GType gtk_file_system_get_type (void); -GSList * gtk_file_system_list_roots (GtkFileSystem *file_system); -GtkFileInfo * gtk_file_system_get_root_info (GtkFileSystem *file_system, - const gchar *uri, - GtkFileInfoType types, - GError **error); +GSList * gtk_file_system_list_roots (GtkFileSystem *file_system); +GtkFileInfo * gtk_file_system_get_root_info (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFileInfoType types, + GError **error); -gboolean gtk_file_system_get_parent (GtkFileSystem *file_system, - const gchar *uri, - gchar **parent, - GError **error); -GtkFileFolder *gtk_file_system_get_folder (GtkFileSystem *file_system, - const gchar *uri, - GtkFileInfoType types, - GError **error); -gboolean gtk_file_system_create_folder (GtkFileSystem *file_system, - const gchar *uri, - GError **error); -gchar * gtk_file_system_make_uri (GtkFileSystem *file_system, - const gchar *base_uri, - const gchar *display_name, - GError **error); -gboolean gtk_file_system_parse (GtkFileSystem *file_system, - const gchar *base_uri, - const gchar *str, - gchar **folder, - gchar **file_part, - GError **error); +gboolean gtk_file_system_get_parent (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFilePath **parent, + GError **error); +GtkFileFolder *gtk_file_system_get_folder (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFileInfoType types, + GError **error); +gboolean gtk_file_system_create_folder (GtkFileSystem *file_system, + const GtkFilePath *path, + GError **error); +GtkFilePath * gtk_file_system_make_path (GtkFileSystem *file_system, + const GtkFilePath *base_path, + const gchar *display_name, + GError **error); +gboolean gtk_file_system_parse (GtkFileSystem *file_system, + const GtkFilePath *base_path, + const gchar *str, + GtkFilePath **folder, + gchar **file_part, + GError **error); + +gchar * gtk_file_system_path_to_uri (GtkFileSystem *file_system, + const GtkFilePath *path); +gchar * gtk_file_system_path_to_filename (GtkFileSystem *file_system, + const GtkFilePath *path); +GtkFilePath *gtk_file_system_uri_to_path (GtkFileSystem *file_system, + const gchar *uri); +GtkFilePath *gtk_file_system_filename_to_path (GtkFileSystem *file_system, + const gchar *filename); + /* * Detailed information about a particular folder */ @@ -189,12 +210,12 @@ struct _GtkFileFolderIface /* Methods */ - GtkFileInfo * (*get_info) (GtkFileFolder *folder, - const gchar *uri, - GError **error); - gboolean (*list_children) (GtkFileFolder *folder, - GSList **children, - GError **error); + GtkFileInfo * (*get_info) (GtkFileFolder *folder, + const GtkFilePath *path, + GError **error); + gboolean (*list_children) (GtkFileFolder *folder, + GSList **children, + GError **error); /* ??? refresh() ??? */ @@ -202,20 +223,43 @@ struct _GtkFileFolderIface */ void (*deleted) (GtkFileFolder *monitor); void (*files_added) (GtkFileFolder *monitor, - GSList *uris); + GSList *paths); void (*files_changed) (GtkFileFolder *monitor, - GSList *uris); + GSList *paths); void (*files_removed) (GtkFileFolder *monitor, - GSList *uris); + GSList *paths); }; GType gtk_file_folder_get_type (void); -gboolean gtk_file_folder_list_children (GtkFileFolder *folder, - GSList **children, - GError **error); -GtkFileInfo *gtk_file_folder_get_info (GtkFileFolder *folder, - const gchar *uri, - GError **error); +gboolean gtk_file_folder_list_children (GtkFileFolder *folder, + GSList **children, + GError **error); +GtkFileInfo *gtk_file_folder_get_info (GtkFileFolder *folder, + const GtkFilePath *path, + GError **error); + +#ifdef __GNUC__ +#define gtk_file_path_new_dup(str) \ + ({ const gchar *__s = (str); (GtkFilePath *)g_strdup(__s); }) +#define gtk_file_path_new_steal(str) \ + ({ gchar *__s = (str); (GtkFilePath *)__s; }) +#define gtk_file_path_get_string(path) \ + ({ const GtkFilePath *__p = (path); (const gchar *)__p; }) +#define gtk_file_path_free(path) \ + ({ GtkFilePath *__p = (path); g_free (__p); }) +#else /* __GNUC__ */ +#define gtk_file_path_new_dup(str) ((GtkFilePath *)g_strdup(str)) +#define gtk_file_path_new_steal(str) ((GtkFilePath *)(str)) +#define gtk_file_path_get_string(path) ((const gchar *)(str)) +#define gtk_file_path_free(path) g_free (path) +#endif/* __GNUC__ */ + +#define gtk_file_path_copy(path) gtk_file_path_new_dup (gtk_file_path_get_string(path)) +#define gtk_file_path_compare(path1,path2) strcmp (gtk_file_path_get_string (path1), \ + gtk_file_path_get_string (path2)) + +GSList *gtk_file_paths_sort (GSList *paths); +void gtk_file_paths_free (GSList *paths); G_END_DECLS diff --git a/gtk/gtkfilesystemmodel.c b/gtk/gtkfilesystemmodel.c index 284738bea..eca5a0b1c 100644 --- a/gtk/gtkfilesystemmodel.c +++ b/gtk/gtkfilesystemmodel.c @@ -54,7 +54,7 @@ struct _GtkFileSystemModel struct _FileModelNode { - gchar *uri; + GtkFilePath *path; FileModelNode *next; GtkFileInfo *info; @@ -114,7 +114,7 @@ static void gtk_file_system_model_unref_node (GtkTreeModel *tr GtkTreeIter *iter); static FileModelNode *file_model_node_new (GtkFileSystemModel *model, - const gchar *uri); + const GtkFilePath *path); static void file_model_node_free (FileModelNode *node); static void file_model_node_ref (FileModelNode *node); static void file_model_node_unref (GtkFileSystemModel *model, @@ -132,25 +132,25 @@ static FileModelNode * file_model_node_get_children (GtkFileSystemModel *mode static void deleted_callback (GtkFileFolder *folder, FileModelNode *node); static void files_added_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, FileModelNode *node); static void files_changed_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, FileModelNode *node); static void files_removed_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, FileModelNode *node); static void root_deleted_callback (GtkFileFolder *folder, GtkFileSystemModel *model); static void root_files_added_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, GtkFileSystemModel *model); static void root_files_changed_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, GtkFileSystemModel *model); static void root_files_removed_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, GtkFileSystemModel *model); GType @@ -271,8 +271,6 @@ gtk_file_system_model_get_column_type (GtkTreeModel *tree_model, { switch (index) { - case GTK_FILE_SYSTEM_MODEL_URI: - return G_TYPE_STRING; case GTK_FILE_SYSTEM_MODEL_INFO: return GTK_TYPE_FILE_INFO; case GTK_FILE_SYSTEM_MODEL_DISPLAY_NAME: @@ -356,10 +354,6 @@ gtk_file_system_model_get_value (GtkTreeModel *tree_model, switch (column) { - case GTK_FILE_SYSTEM_MODEL_URI: - g_value_init (value, G_TYPE_STRING); - g_value_set_string (value, node->uri); - break; case GTK_FILE_SYSTEM_MODEL_INFO: g_value_init (value, GTK_TYPE_FILE_INFO); g_value_set_boxed (value, file_model_node_get_info (model, node)); @@ -527,13 +521,13 @@ gtk_file_system_model_unref_node (GtkTreeModel *tree_model, /** * _gtk_file_system_model_new: * @file_system: an object implementing #GtkFileSystem - * @root_uri: the URI of root of the file system to display, + * @root_path: the path of root of the file system to display, * or %NULL to display starting from the * root or roots of the fielsystem. - * @max_depth: the maximum depth from the children of @root_uri + * @max_depth: the maximum depth from the children of @root_path * or the roots of the file system to display in * the file selector). A depth of 0 displays - * only the immediate children of @root_uri, + * only the immediate children of @root_path, * or the roots of the filesystem. -1 for no * maximum depth. * @types: a bitmask indicating the types of information @@ -543,16 +537,16 @@ gtk_file_system_model_unref_node (GtkTreeModel *tree_model, * * Creates a new #GtkFileSystemModel object. The #GtkFileSystemModel * object wraps a #GtkFileSystem interface as a #GtkTreeModel. - * Using the @root_uri and @max_depth parameters, the tree model + * Using the @root_path and @max_depth parameters, the tree model * can be restricted to a subportion of the entire file system. * * Return value: the newly created #GtkFileSystemModel object. **/ GtkFileSystemModel * -_gtk_file_system_model_new (GtkFileSystem *file_system, - const gchar *root_uri, - gint max_depth, - GtkFileInfoType types) +_gtk_file_system_model_new (GtkFileSystem *file_system, + const GtkFilePath *root_path, + gint max_depth, + GtkFileInfoType types) { GtkFileSystemModel *model; GSList *roots, *tmp_list; @@ -567,20 +561,20 @@ _gtk_file_system_model_new (GtkFileSystem *file_system, model->max_depth = MIN (max_depth, G_MAXUSHORT); model->types = types | GTK_FILE_INFO_IS_FOLDER | GTK_FILE_INFO_IS_HIDDEN; - if (root_uri) + if (root_path) { - GSList *child_uris; + GSList *child_paths; - model->root_folder = gtk_file_system_get_folder (file_system, root_uri, + model->root_folder = gtk_file_system_get_folder (file_system, root_path, model->types, NULL); /* NULL-GError */ if (model->root_folder && gtk_file_folder_list_children (model->root_folder, - &child_uris, + &child_paths, NULL)) /* NULL-GError */ { - roots = child_uris; + roots = child_paths; g_signal_connect (model->root_folder, "deleted", G_CALLBACK (root_deleted_callback), model); @@ -595,12 +589,12 @@ _gtk_file_system_model_new (GtkFileSystem *file_system, else roots = gtk_file_system_list_roots (file_system); - roots = g_slist_sort (roots, (GCompareFunc)strcmp); + roots = gtk_file_paths_sort (roots); for (tmp_list = roots; tmp_list; tmp_list = tmp_list->next) { FileModelNode *node = file_model_node_new (model, tmp_list->data); - g_free (tmp_list->data); + gtk_file_path_free (tmp_list->data); node->is_visible = file_model_node_is_visible (model, node); node->next = model->roots; node->depth = 0; @@ -779,24 +773,24 @@ _gtk_file_system_model_get_info (GtkFileSystemModel *model, } /** - * _gtk_file_system_model_get_uri: + * _gtk_file_system_model_get_path: * @model: a #GtkFileSystemModel * @iter: a #GtkTreeIter pointing to a row of @model * - * Gets the URI for a particular row in @model. + * Gets the path for a particular row in @model. * - * Return value: the URI. This string is owned by @model and - * or freed. If you want to save the URI for later use, + * Return value: the path. This string is owned by @model and + * or freed. If you want to save the path for later use, * you must make a copy, since the string may be freed * on later changes to the file system. **/ -const gchar * -_gtk_file_system_model_get_uri (GtkFileSystemModel *model, - GtkTreeIter *iter) +const GtkFilePath * +_gtk_file_system_model_get_path (GtkFileSystemModel *model, + GtkTreeIter *iter) { FileModelNode *node = iter->user_data; - return node->uri; + return node->path; } static void @@ -811,7 +805,7 @@ unref_node_and_parents (GtkFileSystemModel *model, static FileModelNode * find_child_node (GtkFileSystemModel *model, FileModelNode *parent_node, - const gchar *uri) + const GtkFilePath *path) { FileModelNode *children; @@ -823,7 +817,8 @@ find_child_node (GtkFileSystemModel *model, while (children) { if (children->is_visible && - strcmp (children->uri, uri) == 0) + children->path && + gtk_file_path_compare (children->path, path) == 0) return children; children = children->next; @@ -834,21 +829,21 @@ find_child_node (GtkFileSystemModel *model, static FileModelNode * -find_and_ref_uri (GtkFileSystemModel *model, - const gchar *uri) +find_and_ref_path (GtkFileSystemModel *model, + const GtkFilePath *path) { - gchar *parent_uri; + GtkFilePath *parent_path; FileModelNode *parent_node; FileModelNode *child_node; GtkFileFolder *folder; - if (!gtk_file_system_get_parent (model->file_system, uri, &parent_uri, NULL)) + if (!gtk_file_system_get_parent (model->file_system, path, &parent_path, NULL)) return NULL; - if (parent_uri) + if (parent_path) { - parent_node = find_and_ref_uri (model, parent_uri); - g_free (parent_uri); + parent_node = find_and_ref_path (model, parent_path); + gtk_file_path_free (parent_path); if (!parent_node) return NULL; @@ -856,7 +851,7 @@ find_and_ref_uri (GtkFileSystemModel *model, else parent_node = NULL; - child_node = find_child_node (model, parent_node, uri); + child_node = find_child_node (model, parent_node, path); if (child_node) { file_model_node_ref (child_node); @@ -864,11 +859,11 @@ find_and_ref_uri (GtkFileSystemModel *model, } folder = gtk_file_system_get_folder (model->file_system, - uri, + path, model->types, NULL); /* NULL-GError */ - child_node = find_child_node (model, parent_node, uri); + child_node = find_child_node (model, parent_node, path); if (child_node) { file_model_node_ref (child_node); @@ -882,17 +877,17 @@ find_and_ref_uri (GtkFileSystemModel *model, } /** - * _gtk_file_system_model_uri_do: + * _gtk_file_system_model_path_do: * @model: a #GtkFileSystemModel - * @uri: a URI pointing to a file in the filesystem + * @path: a path pointing to a file in the filesystem * for @model. * @func: Function to call with the path and iter corresponding - * to @uri. + * to @path. * @user_data: data to pass to @func * - * Locates @uri within @model, referencing + * Locates @path within @model, referencing * (gtk_tree_model_ref_node ()) all parent nodes, - * calls @func passing in the path and iter for @uri, + * calls @func passing in the path and iter for @path, * then unrefs all the parent nodes. * * The reason for doing this operation as a callback @@ -904,16 +899,16 @@ find_and_ref_uri (GtkFileSystemModel *model, * This function is particularly useful for expanding * a #GtkTreeView to a particular point in the file system. * - * Return value: %TRUE if the URI was successfully + * Return value: %TRUE if the path was successfully * found in @model and @func was called. **/ gboolean -_gtk_file_system_model_uri_do (GtkFileSystemModel *model, - const gchar *uri, - GtkFileSystemModelURIFunc func, - gpointer user_data) +_gtk_file_system_model_path_do (GtkFileSystemModel *model, + const GtkFilePath *path, + GtkFileSystemModelPathFunc func, + gpointer user_data) { - FileModelNode *node = find_and_ref_uri (model, uri); + FileModelNode *node = find_and_ref_path (model, path); if (node) { @@ -936,12 +931,12 @@ _gtk_file_system_model_uri_do (GtkFileSystemModel *model, static FileModelNode * file_model_node_new (GtkFileSystemModel *model, - const gchar *uri) + const GtkFilePath *path) { FileModelNode *node = g_new0 (FileModelNode, 1); node->model = model; - node->uri = g_strdup (uri); + node->path = path ? gtk_file_path_copy (path) : NULL; return node; } @@ -957,8 +952,8 @@ file_model_node_free (FileModelNode *node) file_model_node_free (children); } - if (node->uri) - g_free (node->uri); + if (node->path) + gtk_file_path_free (node->path); if (node->info) gtk_file_info_free (node->info); @@ -983,13 +978,13 @@ file_model_node_get_info (GtkFileSystemModel *model, else if (node->parent || model->root_folder) { node->info = gtk_file_folder_get_info (node->parent ? node->parent->folder : model->root_folder, - node->uri, + node->path, NULL); /* NULL-GError */ } else { node->info = gtk_file_system_get_root_info (model->file_system, - node->uri, + node->path, model->types, NULL); /* NULL-GError */ } @@ -1079,22 +1074,22 @@ file_model_node_get_children (GtkFileSystemModel *model, if (is_folder) node->folder = gtk_file_system_get_folder (model->file_system, - node->uri, + node->path, model->types, NULL); /* NULL-GError */ if (node->folder) { - GSList *child_uris, *tmp_list; + GSList *child_paths, *tmp_list; - if (gtk_file_folder_list_children (node->folder, &child_uris, NULL)) /* NULL-GError */ + if (gtk_file_folder_list_children (node->folder, &child_paths, NULL)) /* NULL-GError */ { - child_uris = g_slist_sort (child_uris, (GCompareFunc)strcmp); + child_paths = gtk_file_paths_sort (child_paths); - for (tmp_list = child_uris; tmp_list; tmp_list = tmp_list->next) + for (tmp_list = child_paths; tmp_list; tmp_list = tmp_list->next) { FileModelNode *child_node = file_model_node_new (model, tmp_list->data); - g_free (tmp_list->data); + gtk_file_path_free (tmp_list->data); child_node->next = node->children; child_node->parent = node; child_node->depth = node->depth + 1; @@ -1103,7 +1098,7 @@ file_model_node_get_children (GtkFileSystemModel *model, has_children = TRUE; node->children = child_node; } - g_slist_free (child_uris); + g_slist_free (child_paths); } node->children = (FileModelNode *)g_slist_reverse ((GSList *)node->children); @@ -1125,7 +1120,7 @@ file_model_node_get_children (GtkFileSystemModel *model, /* The hard case ... we claimed this folder had children, but actually * it didn't. We have to add a dummy child, possibly to remove later. */ - FileModelNode *child_node = file_model_node_new (model, "***dummy***"); + FileModelNode *child_node = file_model_node_new (model, NULL); child_node->is_visible = TRUE; child_node->parent = node; child_node->is_dummy = TRUE; @@ -1143,18 +1138,17 @@ file_model_node_get_children (GtkFileSystemModel *model, static void do_files_added (GtkFileSystemModel *model, FileModelNode *parent_node, - GSList *uris) + GSList *paths) { GtkTreeModel *tree_model = GTK_TREE_MODEL (model); FileModelNode *children; FileModelNode *prev = NULL; GtkTreeIter iter; GtkTreePath *path; - GSList *sorted_uris; + GSList *sorted_paths; GSList *tmp_list; - sorted_uris = g_slist_copy (uris); - sorted_uris = g_slist_sort (sorted_uris, (GCompareFunc)strcmp); + sorted_paths = gtk_file_paths_sort (g_slist_copy (paths)); if (parent_node) { @@ -1177,11 +1171,12 @@ do_files_added (GtkFileSystemModel *model, gtk_tree_path_next (path); } - for (tmp_list = sorted_uris; tmp_list; tmp_list = tmp_list->next) + for (tmp_list = sorted_paths; tmp_list; tmp_list = tmp_list->next) { - const gchar *uri = tmp_list->data; + const GtkFilePath *file_path = tmp_list->data; - while (children && strcmp (children->uri, uri) < 0) + while (children && + (!children->path || gtk_file_path_compare (children->path, file_path) < 0)) { prev = children; if (children->is_visible) @@ -1190,7 +1185,8 @@ do_files_added (GtkFileSystemModel *model, children = children->next; } - if (children && strcmp (children->uri, uri) == 0) + if (children && + children->path && gtk_file_path_compare (children->path, file_path) == 0) { /* Shouldn't happen */ } @@ -1198,7 +1194,7 @@ do_files_added (GtkFileSystemModel *model, { FileModelNode *new; - new = file_model_node_new (model, uri); + new = file_model_node_new (model, file_path); if (children) new->next = children; @@ -1251,24 +1247,23 @@ do_files_added (GtkFileSystemModel *model, } gtk_tree_path_free (path); - g_slist_free (sorted_uris); + g_slist_free (sorted_paths); } static void do_files_changed (GtkFileSystemModel *model, FileModelNode *parent_node, - GSList *uris) + GSList *paths) { GtkTreeModel *tree_model = GTK_TREE_MODEL (model); FileModelNode *children; FileModelNode *prev = NULL; GtkTreeIter iter; GtkTreePath *path; - GSList *sorted_uris; + GSList *sorted_paths; GSList *tmp_list; - sorted_uris = g_slist_copy (uris); - sorted_uris = g_slist_sort (sorted_uris, (GCompareFunc)strcmp); + sorted_paths = gtk_file_paths_sort (g_slist_copy (paths)); if (parent_node) { @@ -1291,11 +1286,12 @@ do_files_changed (GtkFileSystemModel *model, gtk_tree_path_next (path); } - for (tmp_list = sorted_uris; tmp_list; tmp_list = tmp_list->next) + for (tmp_list = sorted_paths; tmp_list; tmp_list = tmp_list->next) { - const gchar *uri = tmp_list->data; + const GtkFilePath *file_path = tmp_list->data; - while (children && strcmp (children->uri, uri) < 0) + while (children && + (!children->path || gtk_file_path_compare (children->path, file_path) < 0)) { prev = children; if (children->is_visible) @@ -1304,7 +1300,8 @@ do_files_changed (GtkFileSystemModel *model, children = children->next; } - if (children && strcmp (children->uri, uri) == 0) + if (children && + children->path && gtk_file_path_compare (children->path, file_path) == 0) { gtk_tree_model_row_changed (tree_model, path, &iter); } @@ -1315,26 +1312,25 @@ do_files_changed (GtkFileSystemModel *model, } gtk_tree_path_free (path); - g_slist_free (sorted_uris); + g_slist_free (sorted_paths); } static void do_files_removed (GtkFileSystemModel *model, FileModelNode *parent_node, - GSList *uris) + GSList *paths) { GtkTreeModel *tree_model = GTK_TREE_MODEL (model); FileModelNode *children; FileModelNode *prev = NULL; GtkTreeIter iter; GtkTreePath *path; - GSList *sorted_uris; + GSList *sorted_paths; GSList *tmp_list; FileModelNode *tmp_child; gint n_visible; - sorted_uris = g_slist_copy (uris); - sorted_uris = g_slist_sort (sorted_uris, (GCompareFunc)strcmp); + sorted_paths = gtk_file_paths_sort (g_slist_copy (paths)); if (parent_node) { @@ -1367,11 +1363,12 @@ do_files_removed (GtkFileSystemModel *model, gtk_tree_path_next (path); } - for (tmp_list = sorted_uris; tmp_list; tmp_list = tmp_list->next) + for (tmp_list = sorted_paths; tmp_list; tmp_list = tmp_list->next) { - const gchar *uri = tmp_list->data; + const GtkFilePath *file_path = tmp_list->data; - while (children && strcmp (children->uri, uri) < 0) + while (children && + (!children->path || gtk_file_path_compare (children->path, file_path) < 0)) { prev = children; if (children->is_visible) @@ -1380,7 +1377,8 @@ do_files_removed (GtkFileSystemModel *model, children = children->next; } - if (children && strcmp (children->uri, uri) == 0) + if (children && + children->path && gtk_file_path_compare (children->path, file_path) == 0) { FileModelNode *next = children->next; @@ -1389,7 +1387,7 @@ do_files_removed (GtkFileSystemModel *model, if (n_visible == 0) { - FileModelNode *dummy = file_model_node_new (model, "***dummy***"); + FileModelNode *dummy = file_model_node_new (model, NULL); dummy->is_visible = TRUE; dummy->parent = parent_node; dummy->is_dummy = TRUE; @@ -1425,7 +1423,7 @@ do_files_removed (GtkFileSystemModel *model, } gtk_tree_path_free (path); - g_slist_free (sorted_uris); + g_slist_free (sorted_paths); } static void @@ -1436,26 +1434,26 @@ deleted_callback (GtkFileFolder *folder, static void files_added_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, FileModelNode *node) { - do_files_added (node->model, node, uris); + do_files_added (node->model, node, paths); } static void files_changed_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, FileModelNode *node) { - do_files_changed (node->model, node, uris); + do_files_changed (node->model, node, paths); } static void files_removed_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, FileModelNode *node) { - do_files_removed (node->model, node, uris); + do_files_removed (node->model, node, paths); } static void @@ -1466,26 +1464,26 @@ root_deleted_callback (GtkFileFolder *folder, static void root_files_added_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, GtkFileSystemModel *model) { - do_files_added (model, NULL, uris); + do_files_added (model, NULL, paths); } static void root_files_changed_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, GtkFileSystemModel *model) { - do_files_changed (model, NULL, uris); + do_files_changed (model, NULL, paths); } static void root_files_removed_callback (GtkFileFolder *folder, - GSList *uris, + GSList *paths, GtkFileSystemModel *model) { - do_files_removed (model, NULL, uris); + do_files_removed (model, NULL, paths); } diff --git a/gtk/gtkfilesystemmodel.h b/gtk/gtkfilesystemmodel.h index 4edebe7ee..b3647dc6c 100644 --- a/gtk/gtkfilesystemmodel.h +++ b/gtk/gtkfilesystemmodel.h @@ -36,19 +36,18 @@ typedef struct _GtkFileSystemModel GtkFileSystemModel; GType _gtk_file_system_model_get_type (void); enum { - GTK_FILE_SYSTEM_MODEL_URI, GTK_FILE_SYSTEM_MODEL_INFO, GTK_FILE_SYSTEM_MODEL_DISPLAY_NAME, GTK_FILE_SYSTEM_MODEL_N_COLUMNS } GtkFileSystemModelColumns; GtkFileSystemModel *_gtk_file_system_model_new (GtkFileSystem *file_system, - const gchar *root_uri, + const GtkFilePath *root_path, gint max_depth, GtkFileInfoType types); const GtkFileInfo * _gtk_file_system_model_get_info (GtkFileSystemModel *model, GtkTreeIter *iter); -const gchar * _gtk_file_system_model_get_uri (GtkFileSystemModel *model, +const GtkFilePath * _gtk_file_system_model_get_path (GtkFileSystemModel *model, GtkTreeIter *iter); void _gtk_file_system_model_set_show_hidden (GtkFileSystemModel *model, gboolean show_hidden); @@ -58,15 +57,15 @@ void _gtk_file_system_model_set_show_files (GtkFileSystemModel gboolean show_files); -typedef void (*GtkFileSystemModelURIFunc) (GtkFileSystemModel *model, - GtkTreePath *path, - GtkTreeIter *iter, - gpointer user_data); +typedef void (*GtkFileSystemModelPathFunc) (GtkFileSystemModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer user_data); -gboolean _gtk_file_system_model_uri_do (GtkFileSystemModel *model, - const gchar *uri, - GtkFileSystemModelURIFunc func, - gpointer user_data); +gboolean _gtk_file_system_model_path_do (GtkFileSystemModel *model, + const GtkFilePath *path, + GtkFileSystemModelPathFunc func, + gpointer user_data); G_END_DECLS diff --git a/gtk/gtkfilesystemunix.c b/gtk/gtkfilesystemunix.c index 94797a2fd..41ef0ddae 100644 --- a/gtk/gtkfilesystemunix.c +++ b/gtk/gtkfilesystemunix.c @@ -74,32 +74,41 @@ static void gtk_file_system_unix_iface_init (GtkFileSystemIface *iface); static void gtk_file_system_unix_init (GtkFileSystemUnix *impl); static void gtk_file_system_unix_finalize (GObject *object); -static GSList * gtk_file_system_unix_list_roots (GtkFileSystem *file_system); -static GtkFileInfo * gtk_file_system_unix_get_root_info (GtkFileSystem *file_system, - const gchar *uri, - GtkFileInfoType types, - GError **error); -static GtkFileFolder *gtk_file_system_unix_get_folder (GtkFileSystem *file_system, - const gchar *uri, - GtkFileInfoType types, - GError **error); -static gboolean gtk_file_system_unix_create_folder (GtkFileSystem *file_system, - const gchar *uri, - GError **error); -static gboolean gtk_file_system_unix_get_parent (GtkFileSystem *file_system, - const gchar *uri, - gchar **parent, - GError **error); -static gchar * gtk_file_system_unix_make_uri (GtkFileSystem *file_system, - const gchar *base_uri, - const gchar *display_name, - GError **error); -static gboolean gtk_file_system_unix_parse (GtkFileSystem *file_system, - const gchar *base_uri, - const gchar *str, - gchar **folder, - gchar **file_part, - GError **error); +static GSList * gtk_file_system_unix_list_roots (GtkFileSystem *file_system); +static GtkFileInfo * gtk_file_system_unix_get_root_info (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFileInfoType types, + GError **error); +static GtkFileFolder *gtk_file_system_unix_get_folder (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFileInfoType types, + GError **error); +static gboolean gtk_file_system_unix_create_folder (GtkFileSystem *file_system, + const GtkFilePath *path, + GError **error); +static gboolean gtk_file_system_unix_get_parent (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFilePath **parent, + GError **error); +static GtkFilePath * gtk_file_system_unix_make_path (GtkFileSystem *file_system, + const GtkFilePath *base_path, + const gchar *display_name, + GError **error); +static gboolean gtk_file_system_unix_parse (GtkFileSystem *file_system, + const GtkFilePath *base_path, + const gchar *str, + GtkFilePath **folder, + gchar **file_part, + GError **error); + +static gchar * gtk_file_system_unix_path_to_uri (GtkFileSystem *file_system, + const GtkFilePath *path); +static gchar * gtk_file_system_unix_path_to_filename (GtkFileSystem *file_system, + const GtkFilePath *path); +static GtkFilePath *gtk_file_system_unix_uri_to_path (GtkFileSystem *file_system, + const gchar *uri); +static GtkFilePath *gtk_file_system_unix_filename_to_path (GtkFileSystem *file_system, + const gchar *filename); static GType gtk_file_folder_unix_get_type (void); static void gtk_file_folder_unix_class_init (GtkFileFolderUnixClass *class); @@ -108,15 +117,15 @@ static void gtk_file_folder_unix_init (GtkFileFolderUnix *impl); static void gtk_file_folder_unix_finalize (GObject *object); static GtkFileInfo *gtk_file_folder_unix_get_info (GtkFileFolder *folder, - const gchar *uri, + const GtkFilePath *path, GError **error); static gboolean gtk_file_folder_unix_list_children (GtkFileFolder *folder, GSList **children, GError **error); -static gchar * filename_from_uri (const gchar *filename, - GError **error); -static gchar * filename_to_uri (const gchar *filename); +static gchar * filename_from_path (const GtkFilePath *path); +static GtkFilePath *filename_to_path (const gchar *filename); + static gboolean filename_is_root (const char *filename); static GtkFileInfo *filename_get_info (const gchar *filename, GtkFileInfoType types, @@ -196,8 +205,12 @@ gtk_file_system_unix_iface_init (GtkFileSystemIface *iface) iface->get_root_info = gtk_file_system_unix_get_root_info; iface->create_folder = gtk_file_system_unix_create_folder; iface->get_parent = gtk_file_system_unix_get_parent; - iface->make_uri = gtk_file_system_unix_make_uri; + iface->make_path = gtk_file_system_unix_make_path; iface->parse = gtk_file_system_unix_parse; + iface->path_to_uri = gtk_file_system_unix_path_to_uri; + iface->path_to_filename = gtk_file_system_unix_path_to_filename; + iface->uri_to_path = gtk_file_system_unix_uri_to_path; + iface->filename_to_path = gtk_file_system_unix_filename_to_path; } static void @@ -214,32 +227,33 @@ gtk_file_system_unix_finalize (GObject *object) static GSList * gtk_file_system_unix_list_roots (GtkFileSystem *file_system) { - return g_slist_append (NULL, g_strdup ("file:///")); + return g_slist_append (NULL, gtk_file_path_new_dup ("/")); } static GtkFileInfo * gtk_file_system_unix_get_root_info (GtkFileSystem *file_system, - const gchar *uri, + const GtkFilePath *path, GtkFileInfoType types, GError **error) { - g_return_val_if_fail (strcmp (uri, "file:///") == 0, NULL); + const gchar *filename = gtk_file_path_get_string (path); + + g_return_val_if_fail (strcmp (filename, "/") == 0, NULL); return filename_get_info ("/", types, error); } static GtkFileFolder * -gtk_file_system_unix_get_folder (GtkFileSystem *file_system, - const gchar *uri, - GtkFileInfoType types, - GError **error) +gtk_file_system_unix_get_folder (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFileInfoType types, + GError **error) { GtkFileFolderUnix *folder_unix; gchar *filename; - filename = filename_from_uri (uri, error); - if (!filename) - return NULL; + filename = filename_from_path (path); + g_return_val_if_fail (filename != NULL, NULL); folder_unix = g_object_new (GTK_TYPE_FILE_FOLDER_UNIX, NULL); folder_unix->filename = filename; @@ -249,17 +263,16 @@ gtk_file_system_unix_get_folder (GtkFileSystem *file_system, } static gboolean -gtk_file_system_unix_create_folder (GtkFileSystem *file_system, - const gchar *uri, - GError **error) +gtk_file_system_unix_create_folder (GtkFileSystem *file_system, + const GtkFilePath *path, + GError **error) { gchar *filename; gboolean result; - filename = filename_from_uri (uri, error); - if (!filename) - return FALSE; - + filename = filename_from_path (path); + g_return_val_if_fail (filename != NULL, FALSE); + result = mkdir (filename, 0777) != 0; if (!result) @@ -280,15 +293,13 @@ gtk_file_system_unix_create_folder (GtkFileSystem *file_system, } static gboolean -gtk_file_system_unix_get_parent (GtkFileSystem *file_system, - const gchar *uri, - gchar **parent, - GError **error) +gtk_file_system_unix_get_parent (GtkFileSystem *file_system, + const GtkFilePath *path, + GtkFilePath **parent, + GError **error) { - gchar *filename = filename_from_uri (uri, error); - - if (!filename) - return FALSE; + gchar *filename = filename_from_path (path); + g_return_val_if_fail (filename != NULL, FALSE); if (filename_is_root (filename)) { @@ -297,7 +308,7 @@ gtk_file_system_unix_get_parent (GtkFileSystem *file_system, else { gchar *parent_filename = g_path_get_dirname (filename); - *parent = filename_to_uri (parent_filename); + *parent = filename_to_path (parent_filename); g_free (parent_filename); } @@ -306,21 +317,20 @@ gtk_file_system_unix_get_parent (GtkFileSystem *file_system, return TRUE; } -static gchar * -gtk_file_system_unix_make_uri (GtkFileSystem *file_system, - const gchar *base_uri, - const gchar *display_name, - GError **error) +static GtkFilePath * +gtk_file_system_unix_make_path (GtkFileSystem *file_system, + const GtkFilePath *base_path, + const gchar *display_name, + GError **error) { gchar *base_filename; gchar *filename; gchar *full_filename; GError *tmp_error = NULL; - gchar *result; + GtkFilePath *result; - base_filename = filename_from_uri (base_uri, error); - if (!base_filename) - return FALSE; + base_filename = filename_from_path (base_path); + g_return_val_if_fail (base_filename != NULL, NULL); filename = g_filename_from_utf8 (display_name, -1, NULL, NULL, &tmp_error); if (!filename) @@ -338,7 +348,7 @@ gtk_file_system_unix_make_uri (GtkFileSystem *file_system, } full_filename = g_build_filename (base_filename, filename, NULL); - result = filename_to_uri (full_filename); + result = filename_to_path (full_filename); g_free (base_filename); g_free (filename); g_free (full_filename); @@ -420,25 +430,24 @@ canonicalize_filename (gchar *filename) } static gboolean -gtk_file_system_unix_parse (GtkFileSystem *file_system, - const gchar *base_uri, - const gchar *str, - gchar **folder, - gchar **file_part, - GError **error) +gtk_file_system_unix_parse (GtkFileSystem *file_system, + const GtkFilePath *base_path, + const gchar *str, + GtkFilePath **folder, + gchar **file_part, + GError **error) { char *base_filename; gchar *last_slash; gboolean result = FALSE; - base_filename = filename_from_uri (base_uri, error); - if (!base_filename) - return FALSE; + base_filename = filename_from_path (base_path); + g_return_val_if_fail (base_filename != NULL, FALSE); last_slash = strrchr (str, G_DIR_SEPARATOR); if (!last_slash) { - *folder = g_strdup (base_uri); + *folder = gtk_file_path_copy (base_path); *file_part = g_strdup (str); result = TRUE; } @@ -475,7 +484,7 @@ gtk_file_system_unix_parse (GtkFileSystem *file_system, canonicalize_filename (folder_path); - *folder = filename_to_uri (folder_path); + *folder = filename_to_path (folder_path); *file_part = g_strdup (last_slash + 1); g_free (folder_path); @@ -489,6 +498,38 @@ gtk_file_system_unix_parse (GtkFileSystem *file_system, return result; } +static gchar * +gtk_file_system_unix_path_to_uri (GtkFileSystem *file_system, + const GtkFilePath *path) +{ + return g_filename_to_uri (gtk_file_path_get_string (path), NULL, NULL); +} + +static gchar * +gtk_file_system_unix_path_to_filename (GtkFileSystem *file_system, + const GtkFilePath *path) +{ + return g_strdup (gtk_file_path_get_string (path)); +} + +static GtkFilePath * +gtk_file_system_unix_uri_to_path (GtkFileSystem *file_system, + const gchar *uri) +{ + gchar *filename = g_filename_from_uri (uri, NULL, NULL); + if (filename) + return gtk_file_path_new_steal (filename); + else + return NULL; +} + +static GtkFilePath * +gtk_file_system_unix_filename_to_path (GtkFileSystem *file_system, + const gchar *filename) +{ + return gtk_file_path_new_dup (filename); +} + /* * GtkFileFolderUnix */ @@ -564,7 +605,7 @@ gtk_file_folder_unix_finalize (GObject *object) static GtkFileInfo * gtk_file_folder_unix_get_info (GtkFileFolder *folder, - const gchar *uri, + const GtkFilePath *path, GError **error) { GtkFileFolderUnix *folder_unix = GTK_FILE_FOLDER_UNIX (folder); @@ -572,9 +613,8 @@ gtk_file_folder_unix_get_info (GtkFileFolder *folder, gchar *dirname; gchar *filename; - filename = filename_from_uri (uri, error); - if (!filename) - return NULL; + filename = filename_from_path (path); + g_return_val_if_fail (filename != NULL, NULL); dirname = g_path_get_dirname (filename); g_return_val_if_fail (strcmp (dirname, folder_unix->filename) == 0, NULL); @@ -621,7 +661,7 @@ gtk_file_folder_unix_list_children (GtkFileFolder *folder, break; fullname = g_build_filename (folder_unix->filename, filename, NULL); - *children = g_slist_prepend (*children, filename_to_uri (fullname)); + *children = g_slist_prepend (*children, filename_to_path (fullname)); g_free (fullname); } @@ -719,37 +759,15 @@ filename_get_info (const gchar *filename, } static gchar * -filename_from_uri (const char *uri, - GError **error) +filename_from_path (const GtkFilePath *path) { - GError *tmp_error = NULL; - gchar *result; - - result = g_filename_from_uri (uri, NULL, &tmp_error); - if (!result) - { - g_set_error (error, - GTK_FILE_SYSTEM_ERROR, - GTK_FILE_SYSTEM_ERROR_INVALID_URI, - "%s", - tmp_error->message); - - g_error_free (tmp_error); - } - - return result; + return g_strdup (gtk_file_path_get_string (path)); } -static gchar * -filename_to_uri (const char *filename) +static GtkFilePath * +filename_to_path (const char *filename) { - gchar *result; - - result = g_filename_to_uri (filename, NULL, NULL); - if (!result) - g_warning ("GtkFileSystemUnix: Handling of non-UTF-8-representable-filenames needs to be fixed"); - - return result; + return gtk_file_path_new_dup (filename); } static gboolean |