diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index fc25098..de9a4b0 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -55,6 +55,7 @@
 #define MENU_SCROLL_FAST_ZONE  8
 #define MENU_SCROLL_TIMEOUT1  50
 #define MENU_SCROLL_TIMEOUT2  20
+#define GTK_SCROLL_STEP_SMOOTH 2

 #define ATTACH_INFO_KEY "gtk-menu-child-attach-info-key"
 #define ATTACHED_MENUS "gtk-attached-menus"
@@ -3504,17 +3505,25 @@ gtk_menu_scroll (GtkWidget	*widget,
		 GdkEventScroll *event)
 {
   GtkMenu *menu = GTK_MENU (widget);
+  gdouble dx, dy;

-  switch (event->direction)
+  if (gdk_event_get_scroll_deltas ((GdkEvent *) event, &dx, &dy))
     {
-    case GDK_SCROLL_RIGHT:
-    case GDK_SCROLL_DOWN:
-      gtk_menu_scroll_by (menu, MENU_SCROLL_STEP2);
-      break;
-    case GDK_SCROLL_LEFT:
-    case GDK_SCROLL_UP:
-      gtk_menu_scroll_by (menu, - MENU_SCROLL_STEP2);
-      break;
+      gtk_menu_scroll_by (menu, GTK_SCROLL_STEP_SMOOTH * dy);
+    }
+  else
+    {
+      switch (event->direction)
+        {
+        case GDK_SCROLL_RIGHT:
+        case GDK_SCROLL_DOWN:
+          gtk_menu_scroll_by (menu, MENU_SCROLL_STEP2);
+          break;
+        case GDK_SCROLL_LEFT:
+        case GDK_SCROLL_UP:
+          gtk_menu_scroll_by (menu, - MENU_SCROLL_STEP2);
+          break;
+        }
     }

   return TRUE;