+2005-08-19 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtkicontheme.c (theme_lookup_icon): Store GtkIconData structs
+ in the per-directory hash, even if they come from the icon cache.
+ We tried to avoid that before, but as a result leaked icon data
+ structs. (#313852, Kjartan Maraas)
+
2005-08-18 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkmenutoolbutton.c (gtk_menu_tool_button_destroy): Disconnect
+2005-08-19 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtkicontheme.c (theme_lookup_icon): Store GtkIconData structs
+ in the per-directory hash, even if they come from the icon cache.
+ We tried to avoid that before, but as a result leaked icon data
+ structs. (#313852, Kjartan Maraas)
+
2005-08-18 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkmenutoolbutton.c (gtk_menu_tool_button_destroy): Disconnect
+2005-08-19 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtkicontheme.c (theme_lookup_icon): Store GtkIconData structs
+ in the per-directory hash, even if they come from the icon cache.
+ We tried to avoid that before, but as a result leaked icon data
+ structs. (#313852, Kjartan Maraas)
+
2005-08-18 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkmenutoolbutton.c (gtk_menu_tool_button_destroy): Disconnect
static void blow_themes (GtkIconTheme *icon_themes);
-static void icon_data_free (GtkIconData *icon_data);
-static void load_icon_data (IconThemeDir *dir,
- const char *path,
- const char *name);
+static void icon_data_free (GtkIconData *icon_data);
+static void load_icon_data (IconThemeDir *dir,
+ const char *path,
+ const char *name);
static IconSuffix theme_dir_get_icon_suffix (IconThemeDir *dir,
const gchar *icon_name,
if (min_dir->icon_data != NULL)
icon_info->data = g_hash_table_lookup (min_dir->icon_data, icon_name);
- else if (min_dir->cache != NULL)
- icon_info->data = _gtk_icon_cache_get_icon_data (min_dir->cache, icon_name, min_dir->subdir);
- if (icon_info->data == NULL &&
- min_dir->cache && has_icon_file)
+ if (icon_info->data == NULL && min_dir->cache != NULL)
+ {
+ icon_info->data = _gtk_icon_cache_get_icon_data (min_dir->cache, icon_name, min_dir->subdir);
+ if (icon_info->data)
+ {
+ if (min_dir->icon_data == NULL)
+ min_dir->icon_data = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, (GDestroyNotify)icon_data_free);
+
+ g_hash_table_replace (min_dir->icon_data, g_strdup (icon_name), icon_info->data);
+ }
+ }
+
+ if (icon_info->data == NULL && has_icon_file)
{
gchar *icon_file_name, *icon_file_path;
if (g_file_test (icon_file_path, G_FILE_TEST_IS_REGULAR))
{
- if (min_dir->icon_data == NULL)
+ if (min_dir->icon_data == NULL)
min_dir->icon_data = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, (GDestroyNotify)icon_data_free);
load_icon_data (min_dir, icon_file_path, icon_file_name);
g_object_unref (icon_info->pixbuf);
if (icon_info->cache_pixbuf)
g_object_unref (icon_info->cache_pixbuf);
-
+
g_free (icon_info);
}