]> Pileus Git - ~andy/gtk/commitdiff
Do not cache the icon pixbufs but rely on the GtkIconTheme not to hit the
authorEmmanuele Bassi <ebassi@gnome.org>
Fri, 29 Jun 2007 14:51:13 +0000 (14:51 +0000)
committerEmmanuele Bassi <ebassi@src.gnome.org>
Fri, 29 Jun 2007 14:51:13 +0000 (14:51 +0000)
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

ChangeLog
gtk/gtkrecentmanager.c

index 5e5148e9d113263ebdfb7a5403149bfb4cd090e1..3180cd1c2e4445705ee26e843deaf9c2f938c6fc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+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).
+
 2007-06-28  Mathias Hasselmann  <mathias.hasselmann@gmx.de>
 
        * modules/engines/ms-windows/msw_style.c: Draw no bevel
index d8311d4097ee13b216c7d882d8f8de2dfb880ab0..421f036fc246f9b02ac1f8efa1c10890a847c7c0 100644 (file)
@@ -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);