diff --git a/docs/reference/gdk/tmpl/event_structs.sgml b/docs/reference/gdk/tmpl/event_structs.sgml
index 7ebfacb..7148470 100644
--- a/docs/reference/gdk/tmpl/event_structs.sgml
+++ b/docs/reference/gdk/tmpl/event_structs.sgml
@@ -195,6 +195,8 @@ Shift and Alt) and the pointer buttons. See #GdkModifierType.
 @device: the device where the event originated.
 @x_root: the x coordinate of the pointer relative to the root of the screen.
 @y_root: the y coordinate of the pointer relative to the root of the screen.
+@delta: the distance scrolled by the wheel (1.0 by default and on backends
+  that don't report scrolling speeds).
 
 <!-- ##### STRUCT GdkEventMotion ##### -->
 <para>
diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c
index 920245d..f60af6b 100644
--- a/gdk/gdkevents.c
+++ b/gdk/gdkevents.c
@@ -390,6 +390,7 @@ gdk_event_new (GdkEventType type)
       new_event->scroll.y = 0.;
       new_event->scroll.x_root = 0.;
       new_event->scroll.y_root = 0.;
+      new_event->scroll.delta = 1.;
       break;
     case GDK_ENTER_NOTIFY:
     case GDK_LEAVE_NOTIFY:
diff --git a/gdk/gdkevents.h b/gdk/gdkevents.h
index e3441af..c9fe2f8 100644
--- a/gdk/gdkevents.h
+++ b/gdk/gdkevents.h
@@ -340,6 +340,7 @@ struct _GdkEventScroll
   GdkScrollDirection direction;
   GdkDevice *device;
   gdouble x_root, y_root;
+  gdouble delta;
 };
 
 struct _GdkEventKey
diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c
index 2f8b0c8..a9f1cbc 100644
--- a/gdk/quartz/gdkevents-quartz.c
+++ b/gdk/quartz/gdkevents-quartz.c
@@ -911,6 +911,7 @@ fill_scroll_event (GdkWindow          *window,
                    gint                y,
                    gint                x_root,
                    gint                y_root,
+                   gdouble             delta,
                    GdkScrollDirection  direction)
 {
   GdkWindowObject *private;
@@ -930,6 +931,7 @@ fill_scroll_event (GdkWindow          *window,
   event->scroll.state = get_keyboard_modifiers_from_ns_event (nsevent);
   event->scroll.direction = direction;
   event->scroll.device = _gdk_display->core_pointer;
+  event->scroll.delta = delta;
 }
 
 static void
@@ -1274,24 +1276,24 @@ gdk_event_translate (GdkEvent *event,
 	float dy = [nsevent deltaY];
 	GdkScrollDirection direction;
 
-        if (dy != 0)
+        if (dy != 0.0)
           {
             if (dy < 0.0)
               direction = GDK_SCROLL_DOWN;
             else
               direction = GDK_SCROLL_UP;
 
-            fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, direction);
+            fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, dy, direction);
           }
 
-        if (dx != 0)
+        if (dx != 0.0)
           {
             if (dx < 0.0)
               direction = GDK_SCROLL_RIGHT;
             else
               direction = GDK_SCROLL_LEFT;
 
-            fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, direction);
+            fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, dx, direction);
           }
       }
       break;
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index 7cd33c8..4714148 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -2721,7 +2721,7 @@ gtk_range_button_release (GtkWidget      *widget,
 /**
  * _gtk_range_get_wheel_delta:
  * @range: a #GtkRange
- * @direction: A #GdkScrollDirection
+ * @event: A #GdkEventScroll
  * 
  * Returns a good step value for the mouse wheel.
  * 
@@ -2730,8 +2730,8 @@ gtk_range_button_release (GtkWidget      *widget,
  * Since: 2.4
  **/
 gdouble
-_gtk_range_get_wheel_delta (GtkRange           *range,
-			    GdkScrollDirection  direction)
+_gtk_range_get_wheel_delta (GtkRange       *range,
+                            GdkEventScroll *event)
 {
   GtkRangePrivate *priv = range->priv;
   GtkAdjustment *adj = priv->adjustment;
@@ -2742,13 +2742,16 @@ _gtk_range_get_wheel_delta (GtkRange           *range,
   else
     delta = adj->step_increment * 2;
   
-  if (direction == GDK_SCROLL_UP ||
-      direction == GDK_SCROLL_LEFT)
+  if (event->direction == GDK_SCROLL_UP ||
+      event->direction == GDK_SCROLL_LEFT)
     delta = - delta;
   
   if (priv->inverted)
     delta = - delta;
 
+  if (event->delta != 1.0)
+    delta *= event->delta;
+
   return delta;
 }
       
@@ -2765,7 +2768,7 @@ gtk_range_scroll_event (GtkWidget      *widget,
       gdouble delta;
       gboolean handled;
 
-      delta = _gtk_range_get_wheel_delta (range, event->direction);
+      delta = _gtk_range_get_wheel_delta (range, event);
 
       g_signal_emit (range, signals[CHANGE_VALUE], 0,
                      GTK_SCROLL_JUMP, adj->value + delta,
diff --git a/gtk/gtkrange.h b/gtk/gtkrange.h
index 55f2328..2216300 100644
--- a/gtk/gtkrange.h
+++ b/gtk/gtkrange.h
@@ -150,7 +150,7 @@ gdouble            gtk_range_get_fill_level                (GtkRange      *range
 
 /* internal API */
 gdouble            _gtk_range_get_wheel_delta              (GtkRange      *range,
-                                                            GdkScrollDirection direction);
+                                                            GdkEventScroll *direction);
 
 void               _gtk_range_set_stop_values              (GtkRange      *range,
                                                             gdouble       *values,
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index 1b794d4..56a4821 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -1798,7 +1798,7 @@ gtk_scrolled_window_scroll_event (GtkWidget      *widget,
       GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (range));
       gdouble delta;
 
-      delta = _gtk_range_get_wheel_delta (GTK_RANGE (range), event->direction);
+      delta = _gtk_range_get_wheel_delta (GTK_RANGE (range), event);
 
       gtk_adjustment_set_value (adj, adj->value + delta);
 
