--- xfdesktop.bak/src/xfdesktop-icon-view.c 2008-09-20 15:11:12.000000000 +0200 +++ xfdesktop/src/xfdesktop-icon-view.c 2008-09-27 05:22:53.000000000 +0200 @@ -149,7 +149,11 @@ struct _XfdesktopIconViewPrivate GdkDragAction foreign_dest_actions; GdkPixbuf *rounded_frame; - gint label_alpha; + + gint label_alpha[5]; + gint text_shadow_offset_x[5]; + gint text_shadow_offset_y[5]; + GdkColor *text_shadow_color[5]; #if !GTK_CHECK_VERSION(2, 12, 0) guint tip_show_id; @@ -357,11 +361,60 @@ xfdesktop_icon_view_class_init(Xfdesktop G_TYPE_NONE, 0); gtk_widget_class_install_style_property(widget_class, - g_param_spec_int("label-alpha", + g_param_spec_int("normal-label-alpha", "Label alpha", - "Alpha value for the text label's background", + "Alpha value for the text label's background for normal icons", + 0, 255, 155, + G_PARAM_READABLE)); + + gtk_widget_class_install_style_property(widget_class, + g_param_spec_int("selected-label-alpha", + "Selected icons label alpha", + "Alpha value for the text label's background for selected icons", 0, 255, 155, G_PARAM_READABLE)); + + gtk_widget_class_install_style_property(widget_class, + g_param_spec_int("normal-text-shadow-offset-x", + "Normal text shadow X offset", + "X offset for icon label text shadows (0 disables shadow) for normal icons", + -3, 3, 0, + G_PARAM_READABLE)); + + gtk_widget_class_install_style_property(widget_class, + g_param_spec_int("normal-text-shadow-offset-y", + "Normal text shadow Y offset", + "Y offset for icon label text shadows (0 disables shadow) for normal icons", + -3, 3, 0, + G_PARAM_READABLE)); + + gtk_widget_class_install_style_property(widget_class, + g_param_spec_int("selected-text-shadow-offset-x", + "X offset for text shadow", + "X offset for icon label text shadows (0 disables shadow) for selected icons", + -3, 3, 0, + G_PARAM_READABLE)); + + gtk_widget_class_install_style_property(widget_class, + g_param_spec_int("selected-text-shadow-offset-y", + "Y offset for text shadow", + "Y offset for icon label text shadows (0 disables shadow) for selected icons", + -3, 3, 0, + G_PARAM_READABLE)); + + gtk_widget_class_install_style_property(widget_class, + g_param_spec_boxed("normal-text-shadow-color", + "Normal icons label text shadow color", + "Color for the text shadows for the normal icon labels", + GDK_TYPE_COLOR, + G_PARAM_READABLE)); + + gtk_widget_class_install_style_property(widget_class, + g_param_spec_boxed("selected-text-shadow-color", + "Selected icons label text shadow color", + "Color for the text shadows for the selected icon labels", + GDK_TYPE_COLOR, + G_PARAM_READABLE)); xfdesktop_cell_highlight_quark = g_quark_from_static_string("xfdesktop-icon-view-cell-highlight"); } @@ -369,9 +422,19 @@ xfdesktop_icon_view_class_init(Xfdesktop static void xfdesktop_icon_view_init(XfdesktopIconView *icon_view) { + gint i; + icon_view->priv = G_TYPE_INSTANCE_GET_PRIVATE(icon_view, XFDESKTOP_TYPE_ICON_VIEW, XfdesktopIconViewPrivate); + + /* we wanna feel safe */ + for (i = 0; i < 5; i++) { + icon_view->priv->label_alpha[i] = 155; + icon_view->priv->text_shadow_offset_x[i] = 0; + icon_view->priv->text_shadow_offset_y[i] = 0; + icon_view->priv->text_shadow_color[i] = NULL; + } icon_view->priv->repaint_queue = g_hash_table_new_full(g_direct_hash, g_direct_equal, @@ -1372,11 +1435,79 @@ xfdesktop_icon_view_style_set(GtkWidget GtkStyle *previous_style) { XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(widget); - +#ifdef DEBUG + gchar *shadow_color = NULL; +#endif /* DEBUG */ + + gtk_widget_style_get(GTK_WIDGET(icon_view), + "normal-label-alpha", icon_view->priv->label_alpha + GTK_STATE_NORMAL, + NULL); + + gtk_widget_style_get(GTK_WIDGET(icon_view), + "selected-label-alpha", icon_view->priv->label_alpha + GTK_STATE_SELECTED, + NULL); + + gtk_widget_style_get(GTK_WIDGET(icon_view), + "normal-text-shadow-offset-x", icon_view->priv->text_shadow_offset_x + GTK_STATE_NORMAL, + NULL); + + gtk_widget_style_get(GTK_WIDGET(icon_view), + "normal-text-shadow-offset-y", icon_view->priv->text_shadow_offset_y + GTK_STATE_NORMAL, + NULL); + + gtk_widget_style_get(GTK_WIDGET(icon_view), + "selected-text-shadow-offset-x", icon_view->priv->text_shadow_offset_x + GTK_STATE_SELECTED, + NULL); + + gtk_widget_style_get(GTK_WIDGET(icon_view), + "selected-text-shadow-offset-y", icon_view->priv->text_shadow_offset_y + GTK_STATE_SELECTED, + NULL); + + gtk_widget_style_get(GTK_WIDGET(icon_view), + "normal-text-shadow-color", icon_view->priv->text_shadow_color + GTK_STATE_NORMAL, + NULL); + gtk_widget_style_get(GTK_WIDGET(icon_view), - "label-alpha", &icon_view->priv->label_alpha, + "selected-text-shadow-color", icon_view->priv->text_shadow_color + GTK_STATE_SELECTED, NULL); - DBG("label alpha is %d", icon_view->priv->label_alpha); + + DBG("label alpha for icons in normal state is %d", icon_view->priv->label_alpha[GTK_STATE_NORMAL]); + DBG("label alpha for selected icons is %d", icon_view->priv->label->alpha[GTK_STATE_SELECTED]); + DBG("label text shadow x offset for normal icons is %d", icon_view->priv->text_shadow_offset_x[GTK_STATE_NORMAL]); + DBG("label text shadow y offset for normal icons is %d", icon_view->priv->text_shadow_offset_y[GTK_STATE_NORMAL]); + DBG("label text shadow x offset for selected icons is %d", icon_view->priv->text_shadow_offset_x[GTK_STATE_SELECTED]); + DBG("label text shadow y offset for selected icons is %d", icon_view->priv->text_shadow_offset_y[GTK_STATE_SELECTED]); + + if (icon_view->priv->text_shadow_color[GTK_STATE_NORMAL] == NULL) { + DBG("Defaulting normal shadow color"); + + icon_view->priv->text_shadow_color[GTK_STATE_NORMAL] = + gdk_color_copy(&widget->style->fg[GTK_STATE_NORMAL]); + icon_view->priv->text_shadow_color[GTK_STATE_NORMAL]->red ^= 0xffff; + icon_view->priv->text_shadow_color[GTK_STATE_NORMAL]->green ^= 0xffff; + icon_view->priv->text_shadow_color[GTK_STATE_NORMAL]->blue ^= 0xffff; + } + + if (icon_view->priv->text_shadow_color[GTK_STATE_SELECTED] == NULL) { + DBG("Defaulting selected shadow color"); + + icon_view->priv->text_shadow_color[GTK_STATE_SELECTED] = + gdk_color_copy(&widget->style->fg[GTK_STATE_SELECTED]); + icon_view->priv->text_shadow_color[GTK_STATE_SELECTED]->red ^= 0xffff; + icon_view->priv->text_shadow_color[GTK_STATE_SELECTED]->green ^= 0xffff; + icon_view->priv->text_shadow_color[GTK_STATE_SELECTED]->blue ^= 0xffff; + } + + +#ifdef DEBUG + shadow_color = gdk_color_to_string(icon_view->priv->text_shadow_color[GTK_STATE_NORMAL]); + DBG("label shadow color for normal icons is %s", shadow_color); + g_free(shadow_color); + + shadow_color = gdk_color_to_string(icon_view->priv->text_shadow_color[GTK_STATE_SELECTED]); + DBG("label shadow color for selected icons is %s", shadow_color); + g_free(shadow_color); +#endif /* DEBUG */ GTK_WIDGET_CLASS(xfdesktop_icon_view_parent_class)->style_set(widget, previous_style); @@ -1941,6 +2072,7 @@ xfdesktop_paint_rounded_box(XfdesktopIco GdkRectangle *expose_area) { GdkRectangle intersection; + gint alpha; /* make sure to undo this before returning */ text_area->x -= CORNER_ROUNDNESS; @@ -1963,11 +2095,18 @@ xfdesktop_paint_rounded_box(XfdesktopIco xfdesktop_clear_rounded_corners(box_pix, icon_view->priv->rounded_frame); + + if (state == GTK_STATE_NORMAL) + alpha = icon_view->priv->label_alpha[GTK_STATE_NORMAL]; + else + alpha = icon_view->priv->label_alpha[GTK_STATE_SELECTED]; + + xfdesktop_multiply_pixbuf_rgba(box_pix, EEL_RGBA_COLOR_PACK(style->base[state].red >> 8, style->base[state].green >> 8, style->base[state].blue >> 8, - icon_view->priv->label_alpha)); + alpha)); gdk_draw_pixbuf(GDK_DRAWABLE(GTK_WIDGET(icon_view)->window), NULL, box_pix, intersection.x - text_area->x, @@ -1998,6 +2137,7 @@ xfdesktop_icon_view_paint_icon(Xfdesktop GdkRectangle pix_area, text_area, intersection, adj_area; const gchar *label; guint16 row, col; + gint forced_state; TRACE("entering (%s)", xfdesktop_icon_peek_label(icon)); @@ -2085,6 +2225,39 @@ xfdesktop_icon_view_paint_icon(Xfdesktop memcpy(&adj_area, area, sizeof(GdkRectangle)); xfdesktop_paint_rounded_box(icon_view, state, &text_area, &adj_area); + + if (state == GTK_STATE_NORMAL) + forced_state = GTK_STATE_NORMAL; + else + forced_state = GTK_STATE_SELECTED; + + /* draw text shadow for the label text if an offset was defined */ + if ((icon_view->priv->text_shadow_offset_x[forced_state]) || + (icon_view->priv->text_shadow_offset_y[forced_state])) { + GdkGC *tmp_gc; + + /* save the original gc */ + tmp_gc = gdk_gc_new(GDK_DRAWABLE(widget->window)); + gdk_gc_copy(tmp_gc, widget->style->text_gc[state]); + + /* set the new foreground color */ + gdk_gc_set_rgb_fg_color(widget->style->text_gc[state], + icon_view->priv->text_shadow_color[forced_state]); + + /* paint the shadow */ + gtk_paint_layout(widget->style, widget->window, state, TRUE, + &adj_area, widget, "label", + text_area.x + icon_view->priv->text_shadow_offset_x[forced_state], + text_area.y + icon_view->priv->text_shadow_offset_y[forced_state], + playout); + + /* restore the original gc */ + gdk_gc_copy(widget->style->text_gc[state], tmp_gc); + + /* clean */ + g_object_unref(G_OBJECT(tmp_gc)); + } + gtk_paint_layout(widget->style, widget->window, state, FALSE, &adj_area, widget, "label", text_area.x, text_area.y, playout);