0f42f71d2ef007db4abd085db3d3c6ae20bcdb3b
diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index 7a74eba..a33b189 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -544,6 +544,13 @@ gtk_menu_class_init (GtkMenuClass *class)
                                                                  TRUE,
                                                                  GTK_PARAM_READABLE));
 
+  gtk_widget_class_install_style_property (widget_class,
+                                           g_param_spec_boolean ("opposite-arrows",
+                                                                 P_("Opposite Arrows"),
+                                                                 P_("Place the scroll arrows on opposite sides of the menu."),
+                                                                 TRUE,
+                                                                 GTK_PARAM_READABLE));
+
 
  gtk_container_class_install_child_property (container_class,
                                              CHILD_PROP_LEFT_ATTACH,
@@ -2010,13 +2017,23 @@ static void
 get_arrows_border (GtkMenu *menu, GtkBorder *border)
 {
   guint scroll_arrow_height;
+  gboolean opposite_arrows;
 
   gtk_widget_style_get (GTK_WIDGET (menu),
 			"scroll-arrow-vlength", &scroll_arrow_height,
+                        "opposite-arrows", &opposite_arrows,
 			NULL);
 
-  border->top = menu->upper_arrow_visible ? scroll_arrow_height : 0;
-  border->bottom = menu->lower_arrow_visible ? scroll_arrow_height : 0;
+  if (opposite_arrows)
+    {
+      border->top = menu->upper_arrow_visible ? scroll_arrow_height : 0;
+      border->bottom = menu->lower_arrow_visible ? scroll_arrow_height : 0;
+    }
+  else /* arrows on same side */
+    {
+      border->top = 0;
+      border->bottom = (menu->upper_arrow_visible || menu->lower_arrow_visible) ? scroll_arrow_height : 0;
+    }
 
   border->left = border->right = 0;
 }
@@ -2455,26 +2472,43 @@ get_arrows_visible_area (GtkMenu *menu,
   guint vertical_padding;
   guint horizontal_padding;
   gint scroll_arrow_height;
+  gboolean opposite_arrows;
   
   gtk_widget_style_get (widget,
                         "vertical-padding", &vertical_padding,
                         "horizontal-padding", &horizontal_padding,
                         "scroll-arrow-vlength", &scroll_arrow_height,
+                        "opposite-arrows", &opposite_arrows,
                         NULL);
 
   border_x = GTK_CONTAINER (widget)->border_width + widget->style->xthickness + horizontal_padding;
   border_y = GTK_CONTAINER (widget)->border_width + widget->style->ythickness + vertical_padding;
   gdk_drawable_get_size (widget->window, &width, &height);
 
-  upper->x = border_x;
-  upper->y = border_y;
-  upper->width = width - 2*border_x;
-  upper->height = scroll_arrow_height;
-
-  lower->x = border_x;
-  lower->y = height - border_y - scroll_arrow_height;
-  lower->width = width - 2*border_x;
-  lower->height = scroll_arrow_height;
+  if (opposite_arrows)
+    {
+      upper->x = border_x;
+      upper->y = border_y;
+      upper->width = width - 2*border_x;
+      upper->height = scroll_arrow_height;
+
+      lower->x = border_x;
+      lower->y = height - border_y - scroll_arrow_height;
+      lower->width = width - 2*border_x;
+      lower->height = scroll_arrow_height;
+    }
+  else /* arrows on same side */
+    {
+      upper->x = border_x;
+      upper->y = height - border_y - scroll_arrow_height;
+      upper->width = (width - 2*border_x) / 2;
+      upper->height = scroll_arrow_height;
+
+      lower->x = border_x + upper->width;
+      lower->y = height - border_y - scroll_arrow_height;
+      lower->width = (width - 2*border_x) / 2;
+      lower->height = scroll_arrow_height;
+    }
 
   *arrow_space = scroll_arrow_height - 2 * widget->style->ythickness;
 }
@@ -3028,11 +3062,16 @@ get_double_arrows (GtkMenu *menu)
 {
   GtkMenuPrivate *priv = gtk_menu_get_private (menu);
   gboolean        double_arrows;
+  gboolean        opposite_arrows;
 
   gtk_widget_style_get (GTK_WIDGET (menu),
                         "double-arrows", &double_arrows,
+                        "opposite-arrows", &opposite_arrows,
                         NULL);
 
+  if (!opposite_arrows)
+    return TRUE;
+
   return double_arrows || (priv->initially_pushed_in &&
                            menu->scroll_offset != 0);
 }
@@ -3206,12 +3245,14 @@ get_arrows_sensitive_area (GtkMenu *menu,
   guint vertical_padding;
   gint win_x, win_y;
   gint scroll_arrow_height;
+  gboolean opposite_arrows;
 
   gdk_drawable_get_size (GTK_WIDGET (menu)->window, &width, &height);
 
   gtk_widget_style_get (GTK_WIDGET (menu),
 			"vertical-padding", &vertical_padding,
                         "scroll-arrow-vlength", &scroll_arrow_height,
+                        "opposite-arrows", &opposite_arrows,
 			NULL);
 
   border = GTK_CONTAINER (menu)->border_width +
@@ -3219,20 +3260,41 @@ get_arrows_sensitive_area (GtkMenu *menu,
 
   gdk_window_get_position (GTK_WIDGET (menu)->window, &win_x, &win_y);
 
-  if (upper)
+  if (opposite_arrows)
     {
-      upper->x = win_x;
-      upper->y = win_y;
-      upper->width = width;
-      upper->height = scroll_arrow_height + border;
-    }
+      if (upper)
+        {
+          upper->x = win_x;
+          upper->y = win_y;
+          upper->width = width;
+          upper->height = scroll_arrow_height + border;
+        }
 
-  if (lower)
+      if (lower)
+        {
+          lower->x = win_x;
+          lower->y = win_y + height - border - scroll_arrow_height;
+          lower->width = width;
+          lower->height = scroll_arrow_height + border;
+        }
+    }
+  else /* arrows on same side */
     {
-      lower->x = win_x;
-      lower->y = win_y + height - border - scroll_arrow_height;
-      lower->width = width;
-      lower->height = scroll_arrow_height + border;
+      if (upper)
+        {
+          upper->x = win_x;
+          upper->y = win_y + height - border - scroll_arrow_height;
+          upper->width = width/2;
+          upper->height = scroll_arrow_height + border;
+        }
+
+      if (lower)
+        {
+          lower->x = win_x + width/2;
+          lower->y = win_y + height - border - scroll_arrow_height;
+          lower->width = width/2;
+          lower->height = scroll_arrow_height + border;
+        }
     }
 }
 
