Index: gtk/gtkwidget.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkwidget.c,v
retrieving revision 1.425
diff -u -p -r1.425 gtkwidget.c
--- gtk/gtkwidget.c	20 Feb 2006 01:36:50 -0000	1.425
+++ gtk/gtkwidget.c	21 Feb 2006 11:46:21 -0000
@@ -1515,7 +1515,28 @@ gtk_widget_class_init (GtkWidgetClass *k
 							       P_("Visited Link Color"),
 							       P_("Color of visited links"),
 							       GDK_TYPE_COLOR,
-							       GTK_PARAM_READABLE));							       
+							       GTK_PARAM_READABLE));
+
+  gtk_widget_class_install_style_property (klass,
+                                           g_param_spec_boolean ("variable-separators",
+                                                                 P_("Variable Separators"),
+                                                                 P_("Whether separators should be drawn using a box instead of a line"),
+                                                                 FALSE,
+                                                                 GTK_PARAM_READABLE));
+
+  gtk_widget_class_install_style_property (klass,
+                                           g_param_spec_int ("separator-width",
+                                                             P_("Separator Width"),
+                                                             P_("The width of separators if variable-separators is TRUE"),
+                                                             0, 64, 0,
+                                                             GTK_PARAM_READABLE));
+
+  gtk_widget_class_install_style_property (klass,
+                                           g_param_spec_int ("separator-height",
+                                                             P_("Separator Height"),
+                                                             P_("The height of separators if variable-separators is TRUE"),
+                                                             0, 64, 0,
+                                                             GTK_PARAM_READABLE));
 }
 
 static void
Index: gtk/gtkmenuitem.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkmenuitem.c,v
retrieving revision 1.127
diff -u -p -r1.127 gtkmenuitem.c
--- gtk/gtkmenuitem.c	13 Sep 2005 19:57:41 -0000	1.127
+++ gtk/gtkmenuitem.c	21 Feb 2006 11:46:21 -0000
@@ -559,10 +559,20 @@ gtk_menu_item_size_request (GtkWidget   
 	  requisition->width = MAX (requisition->width, get_minimum_width (widget));
 	}
     }
-  else
+  else /* separator item */
     {
-      /* separator item */
-      requisition->height += 4;
+      gboolean variable_separators;
+      gint     separator_height;
+
+      gtk_widget_style_get (widget,
+                            "variable-separators", &variable_separators,
+                            "separator-height",    &separator_height,
+                            NULL);
+
+      if (variable_separators)
+        requisition->height += separator_height + widget->style->ythickness;
+      else
+        requisition->height += widget->style->ythickness * 2;
     }
 
   accel_width = 0;
@@ -824,18 +834,34 @@ gtk_menu_item_paint (GtkWidget    *widge
 	}
       else if (!GTK_BIN (menu_item)->child)
 	{
-	  guint horizontal_padding;
+          gboolean variable_separators;
+          gint     separator_height;
+	  guint    horizontal_padding;
 
 	  gtk_widget_style_get (widget,
-				"horizontal-padding", &horizontal_padding,
-				NULL);
-	  
-	  gtk_paint_hline (widget->style, widget->window, GTK_STATE_NORMAL,
-			   area, widget, "menuitem",
-			   widget->allocation.x + horizontal_padding + widget->style->xthickness,
-			   widget->allocation.x + widget->allocation.width - horizontal_padding - widget->style->xthickness - 1,
-			   widget->allocation.y + (widget->allocation.height -
-						   widget->style->ythickness) / 2);
+                                "variable-separators", &variable_separators,
+                                "separator-height",    &separator_height,
+                                "horizontal-padding",  &horizontal_padding,
+                                NULL);
+
+          if (variable_separators)
+            gtk_paint_box (widget->style, widget->window,
+                           GTK_STATE_NORMAL, GTK_SHADOW_ETCHED_OUT,
+                           area, widget, "separator",
+                           widget->allocation.x + horizontal_padding + widget->style->xthickness,
+                           widget->allocation.y + (widget->allocation.height -
+                                                   separator_height -
+                                                   widget->style->ythickness) / 2,
+                           widget->allocation.x + widget->allocation.width -
+                           2 * (horizontal_padding + widget->style->xthickness) - 1,
+                           separator_height - 1);
+          else
+            gtk_paint_hline (widget->style, widget->window,
+                             GTK_STATE_NORMAL, area, widget, "menuitem",
+                             widget->allocation.x + horizontal_padding + widget->style->xthickness,
+                             widget->allocation.x + widget->allocation.width - horizontal_padding - widget->style->xthickness - 1,
+                             widget->allocation.y + (widget->allocation.height -
+                                                     widget->style->ythickness) / 2);
 	}
     }
 }
Index: gtk/gtkvseparator.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkvseparator.c,v
retrieving revision 1.22
diff -u -p -r1.22 gtkvseparator.c
--- gtk/gtkvseparator.c	1 Sep 2005 05:11:43 -0000	1.22
+++ gtk/gtkvseparator.c	21 Feb 2006 11:46:21 -0000
@@ -30,10 +30,12 @@
 #include "gtkalias.h"
 
 
-static void gtk_vseparator_class_init (GtkVSeparatorClass *klass);
-static void gtk_vseparator_init       (GtkVSeparator      *vseparator);
-static gint gtk_vseparator_expose     (GtkWidget          *widget,
-				       GdkEventExpose     *event);
+static void gtk_vseparator_class_init   (GtkVSeparatorClass *klass);
+static void gtk_vseparator_init         (GtkVSeparator      *vseparator);
+static void gtk_vseparator_size_request (GtkWidget          *widget,
+                                         GtkRequisition     *requisition);
+static gint gtk_vseparator_expose       (GtkWidget          *widget,
+                                         GdkEventExpose     *event);
 
 
 GType
@@ -71,6 +73,7 @@ gtk_vseparator_class_init (GtkVSeparator
 
   widget_class = (GtkWidgetClass*) klass;
 
+  widget_class->size_request = gtk_vseparator_size_request;
   widget_class->expose_event = gtk_vseparator_expose;
 }
 
@@ -87,18 +90,56 @@ gtk_vseparator_new (void)
   return g_object_new (GTK_TYPE_VSEPARATOR, NULL);
 }
 
+static void
+gtk_vseparator_size_request (GtkWidget      *widget,
+                             GtkRequisition *requisition)
+{
+  gboolean variable_separators;
+  gint     separator_width;
+
+  gtk_widget_style_get (widget,
+                        "variable-separators", &variable_separators,
+                        "separator-width",     &separator_width,
+                        NULL);
+
+  if (variable_separators)
+    requisition->height = separator_width;
+  else
+    requisition->height = widget->style->xthickness;
+}
 
 static gint
 gtk_vseparator_expose (GtkWidget      *widget,
 		       GdkEventExpose *event)
 {
   if (GTK_WIDGET_DRAWABLE (widget))
-    gtk_paint_vline (widget->style, widget->window, GTK_WIDGET_STATE (widget),
-		     &event->area, widget, "vseparator",
-		     widget->allocation.y,
-		     widget->allocation.y + widget->allocation.height - 1,
-		     widget->allocation.x + (widget->allocation.width -
-					     widget->style->xthickness) / 2);
+    {
+      gboolean variable_separators;
+      gint     separator_width;
+
+      gtk_widget_style_get (widget,
+                            "variable-separators", &variable_separators,
+                            "separator-width",     &separator_width,
+                            NULL);
+
+      if (variable_separators)
+        gtk_paint_box (widget->style, widget->window,
+                       GTK_WIDGET_STATE (widget), GTK_SHADOW_ETCHED_OUT,
+                       &event->area, widget, "vseparator",
+                       widget->allocation.x + (widget->allocation.width -
+                                               separator_width) / 2,
+                       widget->allocation.y,
+                       separator_width - 1,
+                       widget->allocation.height - 1);
+      else
+        gtk_paint_vline (widget->style, widget->window,
+                         GTK_WIDGET_STATE (widget),
+                         &event->area, widget, "vseparator",
+                         widget->allocation.y,
+                         widget->allocation.y + widget->allocation.height - 1,
+                         widget->allocation.x + (widget->allocation.width -
+                                                 widget->style->xthickness) / 2);
+    }
 
   return FALSE;
 }
Index: gtk/gtkhseparator.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkhseparator.c,v
retrieving revision 1.22
diff -u -p -r1.22 gtkhseparator.c
--- gtk/gtkhseparator.c	1 Sep 2005 05:11:39 -0000	1.22
+++ gtk/gtkhseparator.c	21 Feb 2006 11:46:21 -0000
@@ -30,10 +30,12 @@
 #include "gtkalias.h"
 
 
-static void gtk_hseparator_class_init (GtkHSeparatorClass *klass);
-static void gtk_hseparator_init       (GtkHSeparator      *hseparator);
-static gint gtk_hseparator_expose     (GtkWidget          *widget,
-				       GdkEventExpose     *event);
+static void gtk_hseparator_class_init   (GtkHSeparatorClass *klass);
+static void gtk_hseparator_init         (GtkHSeparator      *hseparator);
+static void gtk_hseparator_size_request (GtkWidget          *widget,
+                                         GtkRequisition     *requisition);
+static gint gtk_hseparator_expose       (GtkWidget          *widget,
+                                         GdkEventExpose     *event);
 
 
 GType
@@ -71,6 +73,7 @@ gtk_hseparator_class_init (GtkHSeparator
 
   widget_class = (GtkWidgetClass*) class;
 
+  widget_class->size_request = gtk_hseparator_size_request;
   widget_class->expose_event = gtk_hseparator_expose;
 }
 
@@ -87,18 +90,56 @@ gtk_hseparator_new (void)
   return g_object_new (GTK_TYPE_HSEPARATOR, NULL);
 }
 
+static void
+gtk_hseparator_size_request (GtkWidget      *widget,
+                             GtkRequisition *requisition)
+{
+  gboolean variable_separators;
+  gint     separator_height;
+
+  gtk_widget_style_get (widget,
+                        "variable-separators", &variable_separators,
+                        "separator-height",    &separator_height,
+                        NULL);
+
+  if (variable_separators)
+    requisition->height = separator_height;
+  else
+    requisition->height = widget->style->ythickness;
+}
 
 static gint
 gtk_hseparator_expose (GtkWidget      *widget,
 		       GdkEventExpose *event)
 {
   if (GTK_WIDGET_DRAWABLE (widget))
-    gtk_paint_hline (widget->style, widget->window, GTK_WIDGET_STATE (widget),
-		     &event->area, widget, "hseparator",
-		     widget->allocation.x,
-		     widget->allocation.x + widget->allocation.width - 1,
-		     widget->allocation.y + (widget->allocation.height -
-					     widget->style->ythickness) / 2);
+    {
+      gboolean variable_separators;
+      gint     separator_height;
+
+      gtk_widget_style_get (widget,
+                            "variable-separators", &variable_separators,
+                            "separator-height",    &separator_height,
+                            NULL);
+
+      if (variable_separators)
+        gtk_paint_box (widget->style, widget->window,
+                       GTK_WIDGET_STATE (widget), GTK_SHADOW_ETCHED_OUT,
+                       &event->area, widget, "hseparator",
+                       widget->allocation.x,
+                       widget->allocation.y + (widget->allocation.height -
+                                               separator_height) / 2,
+                       widget->allocation.width - 1,
+                       separator_height - 1);
+      else
+        gtk_paint_hline (widget->style, widget->window,
+                         GTK_WIDGET_STATE (widget),
+                         &event->area, widget, "hseparator",
+                         widget->allocation.x,
+                         widget->allocation.x + widget->allocation.width - 1,
+                         widget->allocation.y + (widget->allocation.height -
+                                                 widget->style->ythickness) / 2);
+    }
 
   return FALSE;
 }
Index: gtk/gtktoolbar.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtktoolbar.c,v
retrieving revision 1.177
diff -u -p -r1.177 gtktoolbar.c
--- gtk/gtktoolbar.c	26 Dec 2005 07:54:32 -0000	1.177
+++ gtk/gtktoolbar.c	21 Feb 2006 11:46:22 -0000
@@ -4852,21 +4852,55 @@ _gtk_toolbar_paint_space_line (GtkWidget
 
   if (orientation == GTK_ORIENTATION_HORIZONTAL)
     {
-      gtk_paint_vline (widget->style, widget->window,
-		       GTK_WIDGET_STATE (widget), area, widget,
-		       "toolbar",
-		       allocation->y + allocation->height * start_fraction,
-		       allocation->y + allocation->height * end_fraction,
-		       allocation->x + (allocation->width - widget->style->xthickness) / 2);
+      gboolean variable_separators;
+      gint     separator_width;
+
+      gtk_widget_style_get (widget,
+                            "variable-separators", &variable_separators,
+                            "separator-width",     &separator_width,
+                            NULL);
+
+      if (variable_separators)
+        gtk_paint_box (widget->style, widget->window,
+                       GTK_WIDGET_STATE (widget), GTK_SHADOW_ETCHED_OUT,
+                       area, widget, "separator",
+                       allocation->x + (allocation->width - separator_width) / 2,
+                       allocation->y + allocation->height * start_fraction,
+                       separator_width - 1,
+                       allocation->height * (end_fraction - start_fraction) - 1);
+      else
+        gtk_paint_vline (widget->style, widget->window,
+                         GTK_WIDGET_STATE (widget), area, widget,
+                         "toolbar",
+                         allocation->y + allocation->height * start_fraction,
+                         allocation->y + allocation->height * end_fraction,
+                         allocation->x + (allocation->width - widget->style->xthickness) / 2);
     }
   else
     {
-      gtk_paint_hline (widget->style, widget->window,
-		       GTK_WIDGET_STATE (widget), area, widget,
-		       "toolbar",
-		       allocation->x + allocation->width * start_fraction,
-		       allocation->x + allocation->width * end_fraction,
-		       allocation->y + (allocation->height - widget->style->ythickness) / 2);
+      gboolean variable_separators;
+      gint     separator_height;
+
+      gtk_widget_style_get (widget,
+                            "variable-separators", &variable_separators,
+                            "separator-height",    &separator_height,
+                            NULL);
+
+      if (variable_separators)
+        gtk_paint_box (widget->style, widget->window,
+                       GTK_WIDGET_STATE (widget), GTK_SHADOW_ETCHED_OUT,
+                       area, widget, "separator",
+                       allocation->x + allocation->width * start_fraction,
+                       allocation->y + (allocation->height - separator_height) / 2,
+                       allocation->width * (end_fraction - start_fraction) - 1,
+                       separator_height - 1);
+      else
+        gtk_paint_hline (widget->style, widget->window,
+                         GTK_WIDGET_STATE (widget), area, widget,
+                         "toolbar",
+                         allocation->x + allocation->width * start_fraction,
+                         allocation->x + allocation->width * end_fraction,
+                         allocation->y + (allocation->height - widget->style->ythickness) / 2);
     }
 }
 
