gtk+ r21900 - in branches/gtk-2-14: . gtk



Author: matthiasc
Date: Sun Dec 14 04:24:08 2008
New Revision: 21900
URL: http://svn.gnome.org/viewvc/gtk+?rev=21900&view=rev

Log:
2008-12-13  Matthias Clasen  <mclasen redhat com>

        Bug 561494 â FileChooser network browsing and authentication support

        * gtk/gtkfilesystem.[hc] (_gtk_file_info_consider_as_directory):
        Privately export this method. It classifies directories and mountables
        the same.

        * gtk/gtkfilesystem.c (enclosing_volume_mount_cb): Silently drop
        G_IO_ERROR_ALREADY_MOUNTED error for gvfs backends without visible
        mounts.

        * gtk/gtkfilesystemmodel.c:
        * gtk/gtkfilechooserbutton.c:
        * gtk/gtkfilechooserentry.c:
        * gtk/gtkfilechooserdefault.c: Use the new function instead of
        direct checks for G_FILE_TYPE_DIRECTORY throughout.



Modified:
   branches/gtk-2-14/ChangeLog
   branches/gtk-2-14/gtk/gtkfilechooserbutton.c
   branches/gtk-2-14/gtk/gtkfilechooserdefault.c
   branches/gtk-2-14/gtk/gtkfilechooserentry.c
   branches/gtk-2-14/gtk/gtkfilesystem.c
   branches/gtk-2-14/gtk/gtkfilesystem.h
   branches/gtk-2-14/gtk/gtkfilesystemmodel.c

Modified: branches/gtk-2-14/gtk/gtkfilechooserbutton.c
==============================================================================
--- branches/gtk-2-14/gtk/gtkfilechooserbutton.c	(original)
+++ branches/gtk-2-14/gtk/gtkfilechooserbutton.c	Sun Dec 14 04:24:08 2008
@@ -998,7 +998,7 @@
     {
       gboolean is_folder;
 
-      is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+      is_folder = _gtk_file_info_consider_as_directory (info);
 
       data->selected =
 	(((data->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER && is_folder) ||
@@ -1455,7 +1455,7 @@
   if (!data->label)
     data->label = g_strdup (g_file_info_get_display_name (info));
 
-  is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+  is_folder = _gtk_file_info_consider_as_directory (info);
 
   gtk_list_store_set (GTK_LIST_STORE (data->button->priv->model), &iter,
 		      ICON_COLUMN, pixbuf,

Modified: branches/gtk-2-14/gtk/gtkfilechooserdefault.c
==============================================================================
--- branches/gtk-2-14/gtk/gtkfilechooserdefault.c	(original)
+++ branches/gtk-2-14/gtk/gtkfilechooserdefault.c	Sun Dec 14 04:24:08 2008
@@ -2771,7 +2771,7 @@
     case OPERATION_MODE_BROWSE:
       gtk_tree_model_sort_convert_iter_to_child_iter (closure->impl->sort_model, &child_iter, iter);
       info = _gtk_file_system_model_get_info (closure->impl->browse_files_model, &child_iter);
-      is_folder = info ? (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) : FALSE;
+      is_folder = info ? (_gtk_file_info_consider_as_directory (info)) : FALSE;
       break;
 
     case OPERATION_MODE_SEARCH:
@@ -4165,8 +4165,7 @@
 
   if ((data->impl->action == GTK_FILE_CHOOSER_ACTION_OPEN ||
        data->impl->action == GTK_FILE_CHOOSER_ACTION_SAVE) &&
-      data->uris[1] == NULL && !error &&
-      g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)
+      data->uris[1] == NULL && !error && _gtk_file_info_consider_as_directory (info))
     change_folder_and_display_error (data->impl, data->file, FALSE);
   else
     {
@@ -6087,7 +6086,7 @@
   if (!impl->current_filter)
     return TRUE;
 
-  if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_DIRECTORY)
+  if (_gtk_file_info_consider_as_directory (file_info))
     return TRUE;
 
   return !get_is_file_filtered (impl, file, file_info);
@@ -6124,12 +6123,12 @@
   gboolean dir_a, dir_b;										       \
 													       \
   if (info_a)												       \
-    dir_a = (g_file_info_get_file_type (info_a) == G_FILE_TYPE_DIRECTORY);				       \
+    dir_a = _gtk_file_info_consider_as_directory (info_a);						       \
   else													       \
     return impl->list_sort_ascending ? -1 : 1;								       \
 													       \
   if (info_b)												       \
-    dir_b = (g_file_info_get_file_type (info_b) == G_FILE_TYPE_DIRECTORY);				       \
+    dir_b = _gtk_file_info_consider_as_directory (info_b);						       \
   else													       \
     return impl->list_sort_ascending ? 1 : -1;  							       \
 													       \
@@ -6411,9 +6410,9 @@
 	    have_hidden = g_file_info_get_is_hidden (info);
 
 	  if (!have_filtered)
-	    have_filtered = (g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY) &&
+	    have_filtered = (! _gtk_file_info_consider_as_directory (info)) &&
 			     get_is_file_filtered (data->impl, file, info);
-
+	
 	  g_object_unref (info);
 
 	  if (have_hidden && have_filtered)
@@ -6746,7 +6745,7 @@
 	      impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
 	    {
 	      /* We don't want the name to change when clicking on a folder... */
-	      change_entry = (g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY);
+	      change_entry = (! _gtk_file_info_consider_as_directory (info));
 	    }
           else
 	    change_entry = TRUE; /* ... unless we are in SELECT_FOLDER mode */
@@ -6906,7 +6905,7 @@
       g_object_unref (data->original_file);
     }
 
-  if (g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY)
+  if (! _gtk_file_info_consider_as_directory (info))
     goto out;
 
   if (!_gtk_path_bar_set_file (GTK_PATH_BAR (impl->browse_path_bar), data->file, data->keep_trail, NULL))
@@ -7189,7 +7188,7 @@
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_files_tree_view));
   
   info = get_list_file_info (impl, iter);
-  is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+  is_folder = _gtk_file_info_consider_as_directory (info);
 
   if ((is_folder && impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) ||
       (!is_folder && impl->action == GTK_FILE_CHOOSER_ACTION_OPEN))
@@ -7587,7 +7586,7 @@
 
   data->impl->loading_shortcuts = g_slist_remove (data->impl->loading_shortcuts, cancellable);
 
-  if (cancelled || error || g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY)
+  if (cancelled || error || (! _gtk_file_info_consider_as_directory (info)))
     goto out;
 
   pos = shortcuts_get_pos_for_shortcut_folder (data->impl, data->impl->num_shortcuts);
@@ -8135,7 +8134,7 @@
   if (!info)
     parent_is_folder = FALSE;
   else
-    parent_is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+    parent_is_folder = _gtk_file_info_consider_as_directory (info);
 
   if (parent_is_folder)
     {
@@ -8205,7 +8204,7 @@
   if (cancelled)
     goto out;
 
-  file_exists_and_is_not_folder = info && (g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY);
+  file_exists_and_is_not_folder = info && (! _gtk_file_info_consider_as_directory (info));
 
   if (data->impl->action == GTK_FILE_CHOOSER_ACTION_OPEN)
     /* user typed a filename; we are done */
@@ -8619,7 +8618,7 @@
 
   display_name = g_strdup (g_file_info_get_display_name (info));
   mime_type = g_content_type_get_mime_type (g_file_info_get_content_type (info));
-  is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+  is_folder = _gtk_file_info_consider_as_directory (info);
   pixbuf = _gtk_file_info_render_icon (info, GTK_WIDGET (request->impl),
 				       request->impl->icon_size);
 
@@ -9690,7 +9689,7 @@
       goto out;
     }
 
-  is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+  is_folder = _gtk_file_info_consider_as_directory (info);
 
   gtk_list_store_set (request->impl->recent_model, &iter,
                       RECENT_MODEL_COL_IS_FOLDER, is_folder,
@@ -10254,7 +10253,7 @@
   if (cancelled)
     goto out;
 
-  if (!error && g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)
+  if (!error && _gtk_file_info_consider_as_directory (info))
     change_folder_and_display_error (data->impl, data->file, FALSE);
   else
     gtk_file_chooser_default_select_file (GTK_FILE_CHOOSER (data->impl),
@@ -10476,7 +10475,7 @@
 
             gtk_tree_model_sort_convert_iter_to_child_iter (impl->sort_model, &child_iter, &iter);
             info = _gtk_file_system_model_get_info (impl->browse_files_model, &child_iter);
-            if (info && g_file_info_get_file_type (info) != G_FILE_TYPE_DIRECTORY)
+            if (info && (! _gtk_file_info_consider_as_directory (info)))
               return FALSE;
           }
           break;
@@ -10588,11 +10587,27 @@
         info = _gtk_file_system_model_get_info (impl->browse_files_model,
                                                 &child_iter);
 
-        if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)
+        if (_gtk_file_info_consider_as_directory (info))
           {
-	    GFile *file;
+	    GFile *file, *target_file;
+	    const gchar *target_uri;
 
             file = _gtk_file_system_model_get_file (impl->browse_files_model, &child_iter);
+            if (g_file_info_get_file_type (info) == G_FILE_TYPE_MOUNTABLE) 
+              {
+                target_uri = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI);
+                if (target_uri)
+                  {
+                    target_file = g_file_new_for_uri (target_uri);
+                    if (target_file)
+                      {
+                        g_object_unref (file);
+                        file = target_file;
+                      }
+                  }  
+              }
+            
+            
             change_folder_and_display_error (impl, file, FALSE);
             return;
           }
@@ -10720,7 +10735,7 @@
         if (info &&
             (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
              impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER))
-          sensitive = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+          sensitive = _gtk_file_info_consider_as_directory (info);
       }
       break;
     }
@@ -10824,7 +10839,7 @@
   if (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
       impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
     {
-      sensitive = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+      sensitive = _gtk_file_info_consider_as_directory (info);
     }
 
   g_object_set (cell,
@@ -10848,7 +10863,7 @@
   gchar *str;
   gboolean sensitive = TRUE;
 
-  if (!info || g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)
+  if (!info || _gtk_file_info_consider_as_directory (info))
     {
       g_object_set (cell,
 		    "text", NULL,
@@ -10965,7 +10980,7 @@
 
       if (impl->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
 	  impl->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)
-	sensitive = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+	sensitive = _gtk_file_info_consider_as_directory (info);
     }
 
   if (G_UNLIKELY (time_mtime == 0))

Modified: branches/gtk-2-14/gtk/gtkfilechooserentry.c
==============================================================================
--- branches/gtk-2-14/gtk/gtkfilechooserentry.c	(original)
+++ branches/gtk-2-14/gtk/gtkfilechooserentry.c	Sun Dec 14 04:24:08 2008
@@ -439,7 +439,7 @@
 
       if (info)
 	{
-	  if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)
+	  if (_gtk_file_info_consider_as_directory (info))
 	    {
 	      gchar *tmp = display_name;
 	      display_name = g_strconcat (tmp, G_DIR_SEPARATOR_S, NULL);
@@ -1812,7 +1812,7 @@
 
       if (file_info)
         {
-	  retval = (g_file_info_get_file_type (file_info) == G_FILE_TYPE_DIRECTORY);
+	  retval = _gtk_file_info_consider_as_directory (file_info);
 	  g_object_unref (file_info);
 	}
     }

Modified: branches/gtk-2-14/gtk/gtkfilesystem.c
==============================================================================
--- branches/gtk-2-14/gtk/gtkfilesystem.c	(original)
+++ branches/gtk-2-14/gtk/gtkfilesystem.c	Sun Dec 14 04:24:08 2008
@@ -959,6 +959,11 @@
   g_file_mount_enclosing_volume_finish (G_FILE (source_object), result, &error);
   volume = _gtk_file_system_get_volume_for_file (async_data->file_system, G_FILE (source_object));
 
+  /* Silently drop G_IO_ERROR_ALREADY_MOUNTED error for gvfs backends without visible mounts. */
+  /* Better than doing query_info with additional I/O every time. */
+  if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_ALREADY_MOUNTED))
+    g_clear_error (&error);
+
   gdk_threads_enter ();
   ((GtkFileSystemVolumeMountCallback) async_data->callback) (async_data->cancellable, volume,
 							     error, async_data->data);
@@ -1791,3 +1796,13 @@
 
   return pixbuf;
 }
+
+gboolean
+_gtk_file_info_consider_as_directory (GFileInfo *info)
+{
+  GFileType type = g_file_info_get_file_type (info);
+  
+  return (type == G_FILE_TYPE_DIRECTORY ||
+          type == G_FILE_TYPE_MOUNTABLE);
+}
+

Modified: branches/gtk-2-14/gtk/gtkfilesystem.h
==============================================================================
--- branches/gtk-2-14/gtk/gtkfilesystem.h	(original)
+++ branches/gtk-2-14/gtk/gtkfilesystem.h	Sun Dec 14 04:24:08 2008
@@ -172,6 +172,8 @@
 					    GtkWidget *widget,
 					    gint       icon_size);
 
+gboolean	_gtk_file_info_consider_as_directory (GFileInfo *info);
+
 G_END_DECLS
 
 #endif /* __GTK_FILE_SYSTEM_H__ */

Modified: branches/gtk-2-14/gtk/gtkfilesystemmodel.c
==============================================================================
--- branches/gtk-2-14/gtk/gtkfilesystemmodel.c	(original)
+++ branches/gtk-2-14/gtk/gtkfilesystemmodel.c	Sun Dec 14 04:24:08 2008
@@ -444,7 +444,7 @@
   else
     {
       GFileInfo *info = file_model_node_get_info (model, node);
-      return (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+      return _gtk_file_info_consider_as_directory (info);
     }
 }
 
@@ -1330,7 +1330,7 @@
 	  return FALSE;
 	}
 
-      is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+      is_folder = _gtk_file_info_consider_as_directory (info);
 
       if (model->show_folders != model->show_files &&
 	  model->show_folders != is_folder)
@@ -1553,7 +1553,7 @@
     {
       GFileInfo *info = file_model_node_get_info (model, node);
       gboolean has_children = FALSE;
-      gboolean is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY);
+      gboolean is_folder = _gtk_file_info_consider_as_directory (info);
 
       file_model_node_idle_clear_cancel (node);
 



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