diff options
author | Lionel Landwerlin <[email protected]> | 2017-01-06 15:51:48 +0000 |
---|---|---|
committer | raveit65 <[email protected]> | 2018-04-05 09:08:08 +0200 |
commit | 4c377bad72d5c873999c09fcbc8a2ac6aa76d4d6 (patch) | |
tree | 137f22972d3386f819a31d35a1e94ffe7cf4aa60 | |
parent | 70534c029224228e1d7761865b71920ffe0d49a0 (diff) | |
download | caja-4c377bad72d5c873999c09fcbc8a2ac6aa76d4d6.tar.bz2 caja-4c377bad72d5c873999c09fcbc8a2ac6aa76d4d6.tar.xz |
icon-info: hash/store icons using scale factor as well as size
Otherwise we might pick up an icon at an invalid size for a given scale.
https://bugzilla.gnome.org/show_bug.cgi?id=776896
origin commit:
https://gitlab.gnome.org/GNOME/nautilus/commit/53cee1de
-rw-r--r-- | libcaja-private/caja-icon-info.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/libcaja-private/caja-icon-info.c b/libcaja-private/caja-icon-info.c index 7c35f713..70b75ecb 100644 --- a/libcaja-private/caja-icon-info.c +++ b/libcaja-private/caja-icon-info.c @@ -186,12 +186,14 @@ caja_icon_info_new_for_icon_info (GtkIconInfo *icon_info, typedef struct { GIcon *icon; + int scale; int size; } LoadableIconKey; typedef struct { char *filename; + int scale; int size; } ThemedIconKey; @@ -290,7 +292,7 @@ caja_icon_info_clear_caches (void) static guint loadable_icon_key_hash (LoadableIconKey *key) { - return g_icon_hash (key->icon) ^ key->size; + return g_icon_hash (key->icon) ^ key->scale ^ key->size; } static gboolean @@ -298,16 +300,20 @@ loadable_icon_key_equal (const LoadableIconKey *a, const LoadableIconKey *b) { return a->size == b->size && + a->scale == b->scale && g_icon_equal (a->icon, b->icon); } static LoadableIconKey * -loadable_icon_key_new (GIcon *icon, int size) +loadable_icon_key_new (GIcon *icon, + int scale, + int size) { LoadableIconKey *key; key = g_slice_new (LoadableIconKey); key->icon = g_object_ref (icon); + key->scale = scale; key->size = size; return key; @@ -331,16 +337,20 @@ themed_icon_key_equal (const ThemedIconKey *a, const ThemedIconKey *b) { return a->size == b->size && + a->scale == b->scale && g_str_equal (a->filename, b->filename); } static ThemedIconKey * -themed_icon_key_new (const char *filename, int size) +themed_icon_key_new (const char *filename, + int scale, + int size) { ThemedIconKey *key; key = g_slice_new (ThemedIconKey); key->filename = g_strdup (filename); + key->scale = scale; key->size = size; return key; @@ -377,7 +387,8 @@ caja_icon_info_lookup (GIcon *icon, } lookup_key.icon = icon; - lookup_key.size = size; + lookup_key.scale = scale; + lookup_key.size = size * scale; icon_info = g_hash_table_lookup (loadable_icon_cache, &lookup_key); if (icon_info) @@ -401,7 +412,7 @@ caja_icon_info_lookup (GIcon *icon, icon_info = caja_icon_info_new_for_pixbuf (pixbuf, scale); - key = loadable_icon_key_new (icon, size); + key = loadable_icon_key_new (icon, scale, size); g_hash_table_insert (loadable_icon_cache, key, icon_info); return g_object_ref (icon_info); @@ -442,6 +453,7 @@ caja_icon_info_lookup (GIcon *icon, } lookup_key.filename = (char *)filename; + lookup_key.scale = scale; lookup_key.size = size; icon_info = g_hash_table_lookup (themed_icon_cache, &lookup_key); @@ -453,7 +465,7 @@ caja_icon_info_lookup (GIcon *icon, icon_info = caja_icon_info_new_for_icon_info (gtkicon_info, scale); - key = themed_icon_key_new (filename, size); + key = themed_icon_key_new (filename, scale, size); g_hash_table_insert (themed_icon_cache, key, icon_info); g_object_unref (gtkicon_info); |