diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2007-06-29 14:51:13 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@src.gnome.org> | 2007-06-29 14:51:13 +0000 |
commit | 612d8729a2929c671a19cd6259531ad220329987 (patch) | |
tree | a4b06dd8c3883895cf2663598a1fab79feb23736 /gtk/gtkrecentmanager.c | |
parent | befac076a013ee4be61ecc864e7ae6ee867f10f6 (diff) | |
download | gtk+-612d8729a2929c671a19cd6259531ad220329987.tar.gz |
Do not cache the icon pixbufs but rely on the GtkIconTheme not to hit the
2007-06-29 Emmanuele Bassi <ebassi@gnome.org>
* gtk/gtkrecentmanager.c (get_icon_for_mime_type): Do not
cache the icon pixbufs but rely on the GtkIconTheme not to
hit the disk cache too much (should tentatively fix #426987).
svn path=/trunk/; revision=18288
Diffstat (limited to 'gtk/gtkrecentmanager.c')
-rw-r--r-- | gtk/gtkrecentmanager.c | 111 |
1 files changed, 31 insertions, 80 deletions
diff --git a/gtk/gtkrecentmanager.c b/gtk/gtkrecentmanager.c index d8311d4097..421f036fc2 100644 --- a/gtk/gtkrecentmanager.c +++ b/gtk/gtkrecentmanager.c @@ -1847,106 +1847,56 @@ gtk_recent_info_last_application (GtkRecentInfo *info) return g_strdup (name); } -typedef struct -{ - gint size; - GdkPixbuf *pixbuf; -} IconCacheElement; - -static void -icon_cache_element_free (IconCacheElement *element) -{ - if (element->pixbuf) - g_object_unref (element->pixbuf); - g_free (element); -} - -static void -icon_theme_changed (GtkIconTheme *icon_theme) -{ - GHashTable *cache; - - /* Difference from the initial creation is that we don't - * reconnect the signal - */ - cache = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify)g_free, - (GDestroyNotify)icon_cache_element_free); - g_object_set_data_full (G_OBJECT (icon_theme), "gtk-recent-icon-cache", - cache, (GDestroyNotify)g_hash_table_destroy); -} - -/* TODO: use the GtkFileChooser's icon cache instead of our own to reduce - * the memory footprint - */ -static GdkPixbuf * -get_cached_icon (const gchar *name, - gint pixel_size) -{ - GtkIconTheme *icon_theme; - GHashTable *cache; - IconCacheElement *element; - - icon_theme = gtk_icon_theme_get_default (); - cache = g_object_get_data (G_OBJECT (icon_theme), "gtk-recent-icon-cache"); - - if (!cache) - { - cache = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify)g_free, - (GDestroyNotify)icon_cache_element_free); - - g_object_set_data_full (G_OBJECT (icon_theme), "gtk-recent-icon-cache", - cache, (GDestroyNotify)g_hash_table_destroy); - g_signal_connect (icon_theme, "changed", - G_CALLBACK (icon_theme_changed), NULL); - } - - element = g_hash_table_lookup (cache, name); - if (!element) - { - element = g_new0 (IconCacheElement, 1); - g_hash_table_insert (cache, g_strdup (name), element); - } - - if (element->size != pixel_size) - { - if (element->pixbuf) - g_object_unref (element->pixbuf); - - element->size = pixel_size; - element->pixbuf = gtk_icon_theme_load_icon (icon_theme, name, - pixel_size, 0, NULL); - } - - return element->pixbuf ? g_object_ref (element->pixbuf) : NULL; -} - - static GdkPixbuf * get_icon_for_mime_type (const char *mime_type, gint pixel_size) { + GtkIconTheme *icon_theme; const char *separator; GString *icon_name; GdkPixbuf *pixbuf; separator = strchr (mime_type, '/'); if (!separator) - return NULL; /* maybe we should return a GError with "invalid MIME-type" */ + return NULL; + + icon_theme = gtk_icon_theme_get_default (); + + /* try with the three icon name variants for MIME types */ + + /* canonicalize MIME type: foo/x-bar -> foo-x-bar */ + icon_name = g_string_new (NULL); + g_string_append_len (icon_name, mime_type, separator - mime_type); + g_string_append_c (icon_name, '-'); + g_string_append (icon_name, separator + 1); + pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name->str, + pixel_size, + 0, + NULL); + g_string_free (icon_name, TRUE); + if (pixbuf) + return pixbuf; + /* canonicalize MIME type, and prepend "gnome-mime-" */ icon_name = g_string_new ("gnome-mime-"); g_string_append_len (icon_name, mime_type, separator - mime_type); g_string_append_c (icon_name, '-'); g_string_append (icon_name, separator + 1); - pixbuf = get_cached_icon (icon_name->str, pixel_size); + pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name->str, + pixel_size, + 0, + NULL); g_string_free (icon_name, TRUE); if (pixbuf) return pixbuf; + /* try the MIME family icon */ icon_name = g_string_new ("gnome-mime-"); g_string_append_len (icon_name, mime_type, separator - mime_type); - pixbuf = get_cached_icon (icon_name->str, pixel_size); + pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name->str, + pixel_size, + 0, + NULL); g_string_free (icon_name, TRUE); return pixbuf; @@ -1995,7 +1945,8 @@ gtk_recent_info_get_icon (GtkRecentInfo *info, /* this function should never fail */ if (!retval) { - if (info->mime_type && strcmp (info->mime_type, "x-directory/normal") == 0) + if (info->mime_type && + strcmp (info->mime_type, "x-directory/normal") == 0) retval = get_icon_fallback (GTK_STOCK_DIRECTORY, size); else retval = get_icon_fallback (GTK_STOCK_FILE, size); |