Hello
Currently "inode-directory" overrides "folder", "folder-drag-accept",
"folder-visiting" and "folder-open". In fact it should only be used as
a fallback icon to "folder". This patch implements the correct
fallback order for the different folder icons. Fixes bugs 567254 and
539286.
Regards, Krzysztof Kosiński

diff -ru nautilus-2.24.0-orig/libnautilus-private/nautilus-file.c
nautilus-2.24.0/libnautilus-private/nautilus-file.c
--- nautilus-2.24.0-orig/libnautilus-private/nautilus-file.c    2008-09-22
00:02:14.000000000 +0200
+++ nautilus-2.24.0/libnautilus-private/nautilus-file.c 2009-01-10
15:58:23.000000000 +0100
@@ -3410,16 +3410,23 @@
        return FALSE;
 }

+static void
+prepend_icon_name (const char *name,
+                  GThemedIcon *icon)
+{
+       g_themed_icon_prepend_name(icon, name);
+}
+
 GIcon *
 nautilus_file_get_gicon (NautilusFile *file,
                         NautilusFileIconFlags flags)
 {
        const char * const * names;
        const char *name;
-       GPtrArray *array;
+       GPtrArray *prepend_array;
        GIcon *icon;
        int i;
-       gboolean changed;
+       gboolean is_folder = FALSE, is_preview = FALSE, is_inode_directory = 
FALSE;

        if (file == NULL) {
                return NULL;
@@ -3435,41 +3442,54 @@
                      nautilus_file_has_open_window (file))) &&
                    G_IS_THEMED_ICON (file->details->icon)) {
                        names = g_themed_icon_get_names (G_THEMED_ICON 
(file->details->icon));
-                       array = g_ptr_array_new ();
-                       
-                       changed = TRUE;
+                       prepend_array = g_ptr_array_new ();
+
                        for (i = 0; names[i] != NULL; i++) {
                                name = names[i];

-                               if (strcmp (name, "folder") == 0 &&
-                                   (flags & 
NAUTILUS_FILE_ICON_FLAGS_IGNORE_VISITING) == 0 &&
-                                   nautilus_file_has_open_window (file)) {
-                                       changed = TRUE;
-                                       g_ptr_array_add (array, 
"folder-visiting");
-                               }
-                               if (strcmp (name, "folder") == 0 &&
-                                   (flags & 
NAUTILUS_FILE_ICON_FLAGS_FOR_DRAG_ACCEPT)) {
-                                       changed = TRUE;
-                                       g_ptr_array_add (array, 
"folder-drag-accept");
+                               if (strcmp (name, "folder") == 0) {
+                                       is_folder = TRUE;
                                }
-                               if (strcmp (name, "folder") == 0 &&
-                                   (flags & 
NAUTILUS_FILE_ICON_FLAGS_FOR_OPEN_FOLDER)) {
-                                       changed = TRUE;
-                                       g_ptr_array_add (array, "folder-open");
+                               if (strcmp (name, "inode-directory") == 0) {
+                                       is_inode_directory = TRUE;
                                }
                                if (strcmp (name, "text-x-generic") == 0 &&
                                    (flags & 
NAUTILUS_FILE_ICON_FLAGS_EMBEDDING_TEXT)) {
-                                       changed = TRUE;
-                                       g_ptr_array_add (array, 
"text-x-preview");
+                                       is_preview = TRUE;
                                }
-                               g_ptr_array_add (array, (char *)name);
                        }

-                       if (changed) {
-                               icon = g_themed_icon_new_from_names ((char 
**)array->pdata, array->len);
+                       /* Here, we add icons in reverse order of precedence,
+                        * because they are later prepended */
+                       if (is_preview) {
+                               g_ptr_array_add (prepend_array, 
"text-x-preview");
                        }
                        
-                       g_ptr_array_free (array, TRUE);                 
+                       /* "folder" should override "inode-directory", not the 
other way around */
+                       if (is_inode_directory) {
+                               g_ptr_array_add (prepend_array, "folder");
+                       }
+                       if (is_folder && (flags & 
NAUTILUS_FILE_ICON_FLAGS_FOR_OPEN_FOLDER)) {
+                               g_ptr_array_add (prepend_array, "folder-open");
+                       }
+                       if (is_folder &&
+                           (flags & NAUTILUS_FILE_ICON_FLAGS_IGNORE_VISITING) 
== 0 &&
+                           nautilus_file_has_open_window (file)) {
+                               g_ptr_array_add (prepend_array, 
"folder-visiting");
+                       }
+                       if (is_folder &&
+                           (flags & NAUTILUS_FILE_ICON_FLAGS_FOR_DRAG_ACCEPT)) 
{
+                               g_ptr_array_add (prepend_array, 
"folder-drag-accept");
+                       }
+
+                       if (prepend_array->len) {
+                               /* When constructing GThemed Icon, pointers 
from the array
+                                * are reused, but not the array itself, so the 
cast is safe */
+                               icon = g_themed_icon_new_from_names ((char**) 
names, -1);
+                               g_ptr_array_foreach (prepend_array, (GFunc) 
prepend_icon_name, icon);
+                       }
+
+                       g_ptr_array_free (prepend_array, TRUE);                 
                }

                if (icon == NULL) {
--
nautilus-list mailing list
nautilus-list@gnome.org
http://mail.gnome.org/mailman/listinfo/nautilus-list

Reply via email to