struct _MarlinIconInfo { GObject parent; guint64 last_use_time; gboolean is_first_ref; GdkPixbuf *pixbuf; char *display_name; char *icon_name; }; typedef struct _MarlinIconInfo MarlinIconInfo; MarlinIconInfo * marlin_icon_info_lookup (GIcon *icon, int size) { MarlinIconInfo *icon_info; GdkPixbuf *pixbuf = NULL; g_return_val_if_fail (icon && G_IS_ICON (icon), NULL); if (G_IS_LOADABLE_ICON (icon)) { LoadableIconKey lookup_key; LoadableIconKey *key; if (loadable_icon_cache == NULL) { loadable_icon_cache = g_hash_table_new_full ((GHashFunc)loadable_icon_key_hash, (GEqualFunc)loadable_icon_key_equal, (GDestroyNotify) loadable_icon_key_free, (GDestroyNotify) destroy_cache_entry); } lookup_key.icon = icon; lookup_key.size = size; icon_info = g_hash_table_lookup (loadable_icon_cache, &lookup_key); if (icon_info != NULL) { //g_message ("CACHED %s stream %s\n", G_STRFUNC, g_icon_to_string (icon)); return g_object_ref (icon_info); } char *str_icon = g_icon_to_string (icon); pixbuf = gdk_pixbuf_new_from_file_at_size (str_icon, size, size, NULL); icon_info = marlin_icon_info_new_for_pixbuf (pixbuf); if (pixbuf != NULL) { key = loadable_icon_key_new (icon, size); g_hash_table_insert (loadable_icon_cache, key, g_object_ref (icon_info)); g_free (str_icon); } return icon_info; //snip }