From cf216d780cb2c889a3bcb5faa825fc1b21af8896 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Sun, 18 Nov 2012 19:39:11 +1100 Subject: [PATCH] filechooser: Show FUSE mounted locations in shortcuts Since FUSE locations can be handled safely by applications show these mounted locations regardless of whether gtk_file_chooser_set_local_only() is set to TRUE https://bugzilla.gnome.org/show_bug.cgi?id=586367 --- gtk/gtkfilechooser.c | 22 ++++++++++++++++++++-- gtk/gtkfilechooserdefault.c | 10 +++++----- gtk/gtkfilechooserentry.c | 2 +- gtk/gtkfilesystem.c | 14 ++++++++++++++ gtk/gtkfilesystem.h | 3 +++ 5 files changed, 43 insertions(+), 8 deletions(-) diff --git a/gtk/gtkfilechooser.c b/gtk/gtkfilechooser.c index 8e2d64da4..820db562b 100644 --- a/gtk/gtkfilechooser.c +++ b/gtk/gtkfilechooser.c @@ -907,6 +907,10 @@ gtk_file_chooser_get_action (GtkFileChooser *chooser) * rather than the URI functions like * gtk_file_chooser_get_uri(), * + * On some systems non-native files may still be + * available using the native filesystem via a userspace + * filesystem (FUSE). + * * Since: 2.4 **/ void @@ -1345,7 +1349,9 @@ gtk_file_chooser_set_current_name (GtkFileChooser *chooser, * folder. * * Return value: The currently selected URI, or %NULL - * if no file is selected. Free with g_free() + * if no file is selected. If gtk_file_chooser_set_local_only() is set to %TRUE + * (the default) a local URI will be returned for any FUSE locations. + * Free with g_free() * * Since: 2.4 **/ @@ -1360,7 +1366,19 @@ gtk_file_chooser_get_uri (GtkFileChooser *chooser) file = gtk_file_chooser_get_file (chooser); if (file) { - result = g_file_get_uri (file); + if (gtk_file_chooser_get_local_only (chooser)) + { + gchar *local = g_file_get_path (file); + if (local) + { + result = g_filename_to_uri (local, NULL, NULL); + g_free (local); + } + } + else + { + result = g_file_get_uri (file); + } g_object_unref (file); } diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index 498efd135..8f0b27890 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -1854,7 +1854,7 @@ shortcuts_append_bookmarks (GtkFileChooserDefault *impl, file = bookmarks->data; - if (impl->local_only && !g_file_is_native (file)) + if (impl->local_only && _gtk_file_is_path_not_local (file)) continue; if (shortcut_find_position (impl, file) != -1) @@ -1976,16 +1976,16 @@ shortcuts_add_volumes (GtkFileChooserDefault *impl) if (_gtk_file_system_volume_is_mounted (volume)) { GFile *base_file; - gboolean base_is_native = TRUE; + gboolean base_is_not_local = FALSE; base_file = _gtk_file_system_volume_get_root (volume); if (base_file != NULL) { - base_is_native = g_file_is_native (base_file); + base_is_not_local = _gtk_file_is_path_not_local (base_file); g_object_unref (base_file); } - if (!base_is_native) + if (base_is_not_local) continue; } } @@ -7338,7 +7338,7 @@ gtk_file_chooser_default_update_current_folder (GtkFileChooser *chooser, operation_mode_set (impl, OPERATION_MODE_BROWSE); - if (impl->local_only && !g_file_is_native (file)) + if (impl->local_only && _gtk_file_is_path_not_local (file)) { g_set_error_literal (error, GTK_FILE_CHOOSER_ERROR, diff --git a/gtk/gtkfilechooserentry.c b/gtk/gtkfilechooserentry.c index 98ecd24c7..603516a2c 100644 --- a/gtk/gtkfilechooserentry.c +++ b/gtk/gtkfilechooserentry.c @@ -558,7 +558,7 @@ set_completion_folder (GtkFileChooserEntry *chooser_entry, { if (folder_file && chooser_entry->local_only - && !g_file_is_native (folder_file)) + && _gtk_file_is_path_not_local (folder_file)) folder_file = NULL; if ((chooser_entry->current_folder_file diff --git a/gtk/gtkfilesystem.c b/gtk/gtkfilesystem.c index 553e007e0..db09c9a65 100644 --- a/gtk/gtkfilesystem.c +++ b/gtk/gtkfilesystem.c @@ -1273,3 +1273,17 @@ _gtk_file_info_consider_as_directory (GFileInfo *info) type == G_FILE_TYPE_SHORTCUT); } +gboolean +_gtk_file_is_path_not_local (GFile *file) +{ + char *local_file_path; + gboolean is_not_local; + + /* Don't use is_native(), as we want to support fuse paths if available */ + local_file_path = g_file_get_path (file); + is_not_local = (local_file_path == NULL); + g_free (local_file_path); + + return is_not_local; +} + diff --git a/gtk/gtkfilesystem.h b/gtk/gtkfilesystem.h index 83e1f34d5..57b687615 100644 --- a/gtk/gtkfilesystem.h +++ b/gtk/gtkfilesystem.h @@ -128,6 +128,9 @@ GdkPixbuf * _gtk_file_info_render_icon (GFileInfo *info, gboolean _gtk_file_info_consider_as_directory (GFileInfo *info); +/* GFile helper functions */ +gboolean _gtk_file_is_path_not_local (GFile *file); + G_END_DECLS #endif /* __GTK_FILE_SYSTEM_H__ */ -- 2.43.2