summaryrefslogtreecommitdiff
path: root/libcaja-private/caja-icon-info.c
diff options
context:
space:
mode:
authorLionel Landwerlin <[email protected]>2017-01-06 15:51:48 +0000
committerlukefromdc <[email protected]>2018-04-04 21:53:21 -0400
commitcfd502157420406aa56a6b5319f0bd8dc90df8e4 (patch)
treeed990995db20f611b564be30dd9ff04412e715ff /libcaja-private/caja-icon-info.c
parent47246e224272eec098c7f77ade5f2b1470b9dbcd (diff)
downloadcaja-cfd502157420406aa56a6b5319f0bd8dc90df8e4.tar.bz2
caja-cfd502157420406aa56a6b5319f0bd8dc90df8e4.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
Diffstat (limited to 'libcaja-private/caja-icon-info.c')
-rw-r--r--libcaja-private/caja-icon-info.c24
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);