summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorChristian Persch <chpe@gnome.org>2008-10-20 16:55:00 +0000
committerChristian Persch <chpe@src.gnome.org>2008-10-20 16:55:00 +0000
commit4ba6262be9af01d42851db242ef83ece7d8ddb19 (patch)
tree324b62f0856db3f1a98a95bb2aaad3991bc89c12 /gtk
parent093d425393c5a58cb2161944f612779bbdb5e260 (diff)
downloadgtk+-4ba6262be9af01d42851db242ef83ece7d8ddb19.tar.gz
Bug 557059 – crash when compositing emblems with icon
2008-10-20 Christian Persch <chpe@gnome.org> Bug 557059 – crash when compositing emblems with icon * gtk/gtkicontheme.c: (apply_emblems): Copy the pixbuf before using it with gtk_pixbuf_composite, in case its pixdata is read-only (mmaped from icon cache or builtins). svn path=/trunk/; revision=21690
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkicontheme.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index 04ef756ba4..5fc1b3b20b 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -2776,13 +2776,15 @@ static gboolean icon_info_ensure_scale_and_pixbuf (GtkIconInfo*, gboolean);
static void
apply_emblems (GtkIconInfo *info)
{
- GdkPixbuf *icon;
+ GdkPixbuf *icon = NULL;
gint w, h, pos;
GSList *l;
- icon = info->pixbuf;
- w = gdk_pixbuf_get_width (icon);
- h = gdk_pixbuf_get_height (icon);
+ if (info->emblem_infos == NULL)
+ return;
+
+ w = gdk_pixbuf_get_width (info->pixbuf);
+ h = gdk_pixbuf_get_height (info->pixbuf);
for (l = info->emblem_infos, pos = 0; l; l = l->next, pos++)
{
@@ -2826,10 +2828,23 @@ apply_emblems (GtkIconInfo *info)
break;
}
+ if (icon == NULL)
+ {
+ icon = gdk_pixbuf_copy (info->pixbuf);
+ if (icon == NULL)
+ break;
+ }
+
gdk_pixbuf_composite (emblem, icon, x, y, ew, eh, x, y,
scale, scale, GDK_INTERP_BILINEAR, 255);
}
}
+
+ if (icon)
+ {
+ g_object_unref (info->pixbuf);
+ info->pixbuf = icon;
+ }
}
/* This function contains the complicated logic for deciding