Index: gtk/gtklabel.c
===================================================================
--- gtk/gtklabel.c	(revision 17339)
+++ gtk/gtklabel.c	(working copy)
@@ -510,6 +510,13 @@
                                                      G_MAXINT,
                                                      -1,
                                                      GTK_PARAM_READWRITE));
+
+  gtk_widget_class_install_style_property (widget_class,
+                                           g_param_spec_boolean ("draw-dropshadow",
+                                                                 P_("Draw Dropshadow"),
+                                                                 P_("If the label is drawn white on a black dropshadow"),
+                                                                 FALSE,
+                                                                 G_PARAM_READABLE));
   /*
    * Key bindings
    */
@@ -796,6 +803,7 @@
 
   label->use_underline = FALSE;
   label->use_markup = FALSE;
+  label->draw_dropshadow = FALSE;
   
   label->mnemonic_keyval = GDK_VoidSymbol;
   label->layout = NULL;
@@ -1203,9 +1211,31 @@
   g_object_notify (G_OBJECT (label), "attributes");
 }
 
+static void
+set_dropshadow_attribute (GtkLabel *label)
+{
+  GdkColor black = { 0, };
+  PangoAttribute *attr;
+  int length;
 
+  length = strlen (label->text);
+
+  if (!label->effective_attrs)
+    label->effective_attrs = pango_attr_list_new ();
+
+  attr = gdk_pango_attr_embossed_new (TRUE);
+  attr->start_index = 0;
+  attr->end_index = length;
+  pango_attr_list_change (label->effective_attrs, attr);
+
+  attr = gdk_pango_attr_emboss_color_new (&black);
+  attr->start_index = 0;
+  attr->end_index = length;
+  pango_attr_list_change (label->effective_attrs, attr);
+}
+
 /* Calculates text, attrs and mnemonic_keyval from
- * label, use_underline and use_markup
+ * label, use_underline, use_markup and draw_dropshadow
  */
 static void
 gtk_label_recalculate (GtkLabel *label)
@@ -1227,6 +1257,14 @@
 	}
     }
 
+  /* dropshadow can stack with underline and markup
+   * but not user attrs
+   *
+   * ie: if user attrs are set, dropshadow is ignored
+   */
+  if (label->draw_dropshadow && !label->attrs)
+    set_dropshadow_attribute (label);
+
   if (!label->use_underline)
     {
       guint keyval = label->mnemonic_keyval;
@@ -2277,14 +2315,19 @@
 		     GtkStyle  *previous_style)
 {
   GtkLabel *label;
+  gboolean drop;
   
   g_return_if_fail (GTK_IS_LABEL (widget));
   
   label = GTK_LABEL (widget);
 
+  gtk_widget_style_get (widget,
+                        "draw-dropshadow", &drop,
+                        NULL);
+  label->draw_dropshadow = drop;
+
   /* We have to clear the layout, fonts etc. may have changed */
-  gtk_label_clear_layout (label);
-  gtk_label_invalidate_wrap_width (label);
+  gtk_label_recalculate (label);
 }
 
 static void 
@@ -2484,7 +2527,7 @@
 {
   GtkLabel *label;
   gint x, y;
-  
+
   g_return_val_if_fail (GTK_IS_LABEL (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
   
@@ -2497,15 +2540,20 @@
     {
       get_layout_location (label, &x, &y);
 
-      gtk_paint_layout (widget->style,
-                        widget->window,
-                        GTK_WIDGET_STATE (widget),
-			FALSE,
-                        &event->area,
-                        widget,
-                        "label",
-                        x, y,
-                        label->layout);
+      if (label->draw_dropshadow) 
+        gdk_draw_layout (widget->window,
+                         widget->style->white_gc,
+                         x, y, label->layout);
+      else
+        gtk_paint_layout (widget->style,
+                          widget->window,
+                          GTK_WIDGET_STATE (widget),
+                          FALSE,
+                          &event->area,
+                          widget,
+                          "label",
+                          x, y,
+                          label->layout);
       
       if (label->select_info &&
           (label->select_info->selection_anchor !=
Index: gtk/gtklabel.h
===================================================================
--- gtk/gtklabel.h	(revision 17339)
+++ gtk/gtklabel.h	(working copy)
@@ -62,6 +62,7 @@
   guint   have_transform   : 1;
   guint   in_click         : 1;
   guint   wrap_mode        : 3;
+  guint   draw_dropshadow  : 1;
 
   guint   mnemonic_keyval;
   
