diff -Naurp xfdesktop.bak/src/xfdesktop-icon-view.c xfdesktop/src/xfdesktop-icon-view.c --- xfdesktop.bak/src/xfdesktop-icon-view.c 2008-10-14 19:47:33.000000000 +0200 +++ xfdesktop/src/xfdesktop-icon-view.c 2008-10-16 10:45:29.000000000 +0200 @@ -168,6 +168,9 @@ struct _XfdesktopIconViewPrivate gdouble cell_text_width_proportion; gboolean ellipsize_icon_labels; + + GdkGC *shadow_gc; + GdkGC *selected_shadow_gc; }; static gboolean xfdesktop_icon_view_button_press(GtkWidget *widget, @@ -464,6 +467,9 @@ xfdesktop_icon_view_init(XfdesktopIconVi NULL, (GDestroyNotify)xfdesktop_ird_free); + icon_view->priv->shadow_gc = NULL; + icon_view->priv->selected_shadow_gc = NULL; + icon_view->priv->icon_size = DEFAULT_ICON_SIZE; icon_view->priv->font_size = DEFAULT_FONT_SIZE; @@ -1379,6 +1385,7 @@ xfdesktop_icon_view_style_set(GtkWidget { XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(widget); GtkWidget *dummy; + GtkWidget *toplevel = NULL; gtk_widget_style_get(GTK_WIDGET(icon_view), "label-alpha", &icon_view->priv->label_alpha, @@ -1465,6 +1472,22 @@ xfdesktop_icon_view_style_set(GtkWidget GTK_WIDGET_CLASS(xfdesktop_icon_view_parent_class)->style_set(widget, previous_style); + toplevel = gtk_widget_get_toplevel(widget); + + if(icon_view->priv->shadow_color && GTK_WIDGET_TOPLEVEL(toplevel)) { + if(icon_view->priv->shadow_gc) + g_object_unref(G_OBJECT(icon_view->priv->shadow_gc)); + icon_view->priv->shadow_gc = gdk_gc_new(GDK_DRAWABLE(toplevel->window)); + gdk_gc_set_rgb_fg_color(icon_view->priv->shadow_gc, icon_view->priv->shadow_color); + } + + if(icon_view->priv->selected_shadow_color && GTK_WIDGET_TOPLEVEL(toplevel)) { + if(icon_view->priv->selected_shadow_gc) + g_object_unref(G_OBJECT(icon_view->priv->selected_shadow_gc)); + icon_view->priv->selected_shadow_gc = gdk_gc_new(GDK_DRAWABLE(toplevel->window)); + gdk_gc_set_rgb_fg_color(icon_view->priv->selected_shadow_gc, icon_view->priv->selected_shadow_color); + } + /* do this after we're sure we have a style set */ if(!icon_view->priv->selection_box_color) { GtkStyle *style = gtk_widget_get_style(widget); @@ -1646,6 +1669,16 @@ xfdesktop_icon_view_unrealize(GtkWidget gdk_color_free(icon_view->priv->selected_shadow_color); icon_view->priv->selected_shadow_color = NULL; } + + if(icon_view->priv->shadow_gc) { + g_object_unref(G_OBJECT(icon_view->priv->shadow_gc)); + icon_view->priv->shadow_gc = NULL; + } + + if(icon_view->priv->selected_shadow_gc) { + g_object_unref(G_OBJECT(icon_view->priv->selected_shadow_gc)); + icon_view->priv->selected_shadow_gc = NULL; + } widget->window = NULL; GTK_WIDGET_UNSET_FLAGS(widget, GTK_REALIZED); @@ -2144,7 +2177,7 @@ xfdesktop_icon_view_paint_icon(Xfdesktop const gchar *label; guint16 row, col; gchar x_offset = 0, y_offset = 0; - GdkColor *sh_text_col = NULL; + GdkGC *sh_text_gc = NULL; /*TRACE("entering (%s)", xfdesktop_icon_peek_label(icon));*/ @@ -2234,27 +2267,22 @@ xfdesktop_icon_view_paint_icon(Xfdesktop if (state == GTK_STATE_NORMAL) { x_offset = icon_view->priv->shadow_x_offset; y_offset = icon_view->priv->shadow_y_offset; - sh_text_col = icon_view->priv->shadow_color; + sh_text_gc = icon_view->priv->shadow_gc; } else { x_offset = icon_view->priv->selected_shadow_x_offset; y_offset = icon_view->priv->selected_shadow_y_offset; - sh_text_col = icon_view->priv->selected_shadow_color; + sh_text_gc = icon_view->priv->selected_shadow_gc; } /* draw text shadow for the label text if an offset was defined */ - if (x_offset || y_offset) { + if (x_offset || y_offset && sh_text_gc) { GdkGC *tmp_gc; - /* FIXME: it's probably not good for performance to create and - * destroy a GC every time an icon gets painted. might want - * to cache this somewhere. */ - - /* save the original gc */ - tmp_gc = gdk_gc_new(GDK_DRAWABLE(widget->window)); - gdk_gc_copy(tmp_gc, widget->style->text_gc[state]); + /* save the original gc pointer */ + tmp_gc = widget->style->text_gc[state]; - /* set the new foreground color */ - gdk_gc_set_rgb_fg_color(widget->style->text_gc[state], sh_text_col); + /* set the new gc */ + widget->style->text_gc[state] = sh_text_gc; /* paint the shadow */ gtk_paint_layout(widget->style, widget->window, state, TRUE, @@ -2264,10 +2292,7 @@ xfdesktop_icon_view_paint_icon(Xfdesktop playout); /* restore the original gc */ - gdk_gc_copy(widget->style->text_gc[state], tmp_gc); - - /* clean */ - g_object_unref(G_OBJECT(tmp_gc)); + widget->style->text_gc[state] = tmp_gc; } xfdesktop_paint_rounded_box(icon_view, state, &text_area, &adj_area);