158 lines
5.1 KiB
Diff
158 lines
5.1 KiB
Diff
Index: libnautilus-private/nautilus-icon-factory.c
|
|
===================================================================
|
|
--- libnautilus-private/nautilus-icon-factory.c (.../tags/NAUTILUS_2_20_0) (revision 13249)
|
|
+++ libnautilus-private/nautilus-icon-factory.c (.../branches/gnome-2-20) (revision 13249)
|
|
@@ -200,7 +200,7 @@
|
|
const char *modifier,
|
|
guint nominal_size,
|
|
gboolean force_nominal);
|
|
-static void nautilus_icon_factory_clear (void);
|
|
+static void nautilus_icon_factory_clear (gboolean clear_pathnames);
|
|
|
|
GNOME_CLASS_BOILERPLATE (NautilusIconFactory,
|
|
nautilus_icon_factory,
|
|
@@ -270,7 +270,7 @@
|
|
{
|
|
NautilusIconFactory *factory;
|
|
|
|
- nautilus_icon_factory_clear ();
|
|
+ nautilus_icon_factory_clear (FALSE);
|
|
|
|
factory = user_data;
|
|
|
|
@@ -384,9 +384,21 @@
|
|
goto out;
|
|
}
|
|
|
|
+ if (!gdk_pixbuf_get_has_alpha (pixbuf)) {
|
|
+ /* we don't own the pixbuf, but nautilus_thumbnail_frame_image() assumes so and unrefs it. */
|
|
+ g_object_ref (pixbuf);
|
|
+
|
|
+ nautilus_thumbnail_frame_image (&pixbuf);
|
|
+ /* at this point, we own a pixbuf, which is the framed version of the passed-in pixbuf. */
|
|
+ }
|
|
+
|
|
cached_icon = cache_icon_new (pixbuf, NULL, scale_x, scale_y);
|
|
cached_icon->mtime = statbuf.st_mtime;
|
|
|
|
+ if (!gdk_pixbuf_get_has_alpha (pixbuf)) {
|
|
+ g_object_unref (pixbuf);
|
|
+ }
|
|
+
|
|
if (cached_icon != NULL) {
|
|
key = g_new (CacheKey, 1);
|
|
key->name = g_strdup (path);
|
|
@@ -714,9 +726,23 @@
|
|
return TRUE;
|
|
}
|
|
|
|
-/* Reset the cache to the default state. */
|
|
+static gboolean
|
|
+remove_non_pathnames (gpointer _key, gpointer value, gpointer user_data)
|
|
+{
|
|
+ CacheKey *key = _key;
|
|
+
|
|
+ if (key->name && key->name[0] == '/') {
|
|
+ return FALSE;
|
|
+ }
|
|
+
|
|
+ return TRUE; /* Tell the caller to remove the hash table entry. */
|
|
+}
|
|
+
|
|
+/* Reset the cache to the default state.
|
|
+ Clear pathnames can be set to FALSE which means we only clear icon names, not
|
|
+ absolute pathnames. This is useful to avoid throwing away all loaded thumbnails. */
|
|
static void
|
|
-nautilus_icon_factory_clear (void)
|
|
+nautilus_icon_factory_clear (gboolean clear_pathnames)
|
|
{
|
|
NautilusIconFactory *factory;
|
|
CircularList *head;
|
|
@@ -724,24 +750,25 @@
|
|
factory = get_icon_factory ();
|
|
|
|
g_hash_table_foreach_remove (factory->icon_cache,
|
|
- remove_all,
|
|
+ clear_pathnames ? remove_all : remove_non_pathnames,
|
|
NULL);
|
|
|
|
/* Empty out the recently-used list. */
|
|
head = &factory->recently_used_dummy_head;
|
|
|
|
- /* fallback_icon hangs around, but we don't know if it
|
|
- * was ever inserted in the list
|
|
- */
|
|
- g_assert (factory->recently_used_count == 0 ||
|
|
- factory->recently_used_count == 1);
|
|
-
|
|
- if (factory->recently_used_count == 1) {
|
|
- /* make sure this one is the fallback_icon */
|
|
- g_assert (head->next == head->prev);
|
|
- g_assert (&factory->fallback_icon->recently_used_node == head->next);
|
|
+ if (clear_pathnames) {
|
|
+ /* fallback_icon hangs around, but we don't know if it
|
|
+ * was ever inserted in the list
|
|
+ */
|
|
+ g_assert (factory->recently_used_count == 0 ||
|
|
+ factory->recently_used_count == 1);
|
|
+ if (factory->recently_used_count == 1) {
|
|
+ /* make sure this one is the fallback_icon */
|
|
+ g_assert (head->next == head->prev);
|
|
+ g_assert (&factory->fallback_icon->recently_used_node == head->next);
|
|
+ }
|
|
}
|
|
-
|
|
+
|
|
}
|
|
|
|
static void
|
|
@@ -794,7 +821,7 @@
|
|
* signal to mean only "thumbnails might have changed" if this ends up being slow
|
|
* for some reason.
|
|
*/
|
|
- nautilus_icon_factory_clear ();
|
|
+ nautilus_icon_factory_clear (TRUE);
|
|
g_signal_emit (global_icon_factory,
|
|
signals[ICONS_CHANGED], 0);
|
|
}
|
|
@@ -808,7 +835,7 @@
|
|
* signal to mean only "thumbnails might have changed" if this ends up being slow
|
|
* for some reason.
|
|
*/
|
|
- nautilus_icon_factory_clear ();
|
|
+ nautilus_icon_factory_clear (TRUE);
|
|
g_signal_emit (global_icon_factory,
|
|
signals[ICONS_CHANGED], 0);
|
|
}
|
|
@@ -818,7 +845,7 @@
|
|
{
|
|
show_image_thumbs = eel_preferences_get_enum (NAUTILUS_PREFERENCES_SHOW_IMAGE_FILE_THUMBNAILS);
|
|
|
|
- nautilus_icon_factory_clear ();
|
|
+ nautilus_icon_factory_clear (TRUE);
|
|
/* If the user disabled thumbnailing, remove all outstanding thumbnails */
|
|
if (show_image_thumbs == NAUTILUS_SPEED_TRADEOFF_NEVER) {
|
|
nautilus_thumbnail_remove_all_from_queue ();
|
|
@@ -836,7 +863,7 @@
|
|
/* We don't know which data changed, so we have to assume that
|
|
* any or all icons might have changed.
|
|
*/
|
|
- nautilus_icon_factory_clear ();
|
|
+ nautilus_icon_factory_clear (FALSE);
|
|
g_signal_emit (get_icon_factory (),
|
|
signals[ICONS_CHANGED], 0);
|
|
}
|
|
Index: libnautilus-private/nautilus-directory-async.c
|
|
===================================================================
|
|
--- libnautilus-private/nautilus-directory-async.c (.../tags/NAUTILUS_2_20_0) (revision 13249)
|
|
+++ libnautilus-private/nautilus-directory-async.c (.../branches/gnome-2-20) (revision 13249)
|
|
@@ -594,7 +594,7 @@
|
|
NAUTILUS_FILE_ATTRIBUTE_FILE_TYPE |
|
|
NAUTILUS_FILE_ATTRIBUTE_DIRECTORY_ITEM_MIME_TYPES;
|
|
|
|
- nautilus_directory_invalidate_file_attributes (dir, attrs);
|
|
+ nautilus_directory_force_reload_internal (dir, attrs);
|
|
}
|
|
|
|
void
|