[gtk+] filechooser: Show FUSE mounted locations in shortcuts



commit cf216d780cb2c889a3bcb5faa825fc1b21af8896
Author: Timothy Arceri <t_arceri yahoo com au>
Date:   Sun Nov 18 19:39:11 2012 +1100

    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 8e2d64d..820db56 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 498efd1..8f0b278 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 98ecd24..603516a 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 553e007..db09c9a 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 83e1f34..57b6876 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__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]