Index: gdk/x11/gdkevents-x11.c
===================================================================
--- gdk/x11/gdkevents-x11.c	(revision 19746)
+++ gdk/x11/gdkevents-x11.c	(working copy)
@@ -1135,7 +1135,8 @@
 	  event->scroll.y_root = (gfloat)xevent->xbutton.y_root;
 	  event->scroll.state = (GdkModifierType) xevent->xbutton.state;
 	  event->scroll.device = display->core_pointer;
-	  
+	  event->scroll.delta = 1;
+
 	  if (!set_screen_from_root (display, event, xevent->xbutton.root))
 	    {
 	      return_val = FALSE;
Index: gdk/win32/gdkevents-win32.c
===================================================================
--- gdk/win32/gdkevents-win32.c	(revision 19746)
+++ gdk/win32/gdkevents-win32.c	(working copy)
@@ -1079,9 +1079,10 @@
 	       event->configure.width, event->configure.height);
       break;
     case GDK_SCROLL:
-      g_print ("(%.4g,%.4g) (%.4g,%.4g) %s ",
+      g_print ("(%.4g,%.4g) (%.4g,%.4g) %.4g %s ",
 	       event->scroll.x, event->scroll.y,
 	       event->scroll.x_root, event->scroll.y_root,
+	       event->scroll.delta,
 	       (event->scroll.direction == GDK_SCROLL_UP ? "UP" :
 		(event->scroll.direction == GDK_SCROLL_DOWN ? "DOWN" :
 		 (event->scroll.direction == GDK_SCROLL_LEFT ? "LEFT" :
@@ -2221,6 +2222,7 @@
       event->scroll.y = (gint16) point.y + yoffset;
       event->scroll.x_root = (gint16) GET_X_LPARAM (msg->lParam) + _gdk_offset_x;
       event->scroll.y_root = (gint16) GET_Y_LPARAM (msg->lParam) + _gdk_offset_y;
+      event->scroll.delta = 1;
       event->scroll.state = 0;	/* No state information with MSH_MOUSEWHEEL */
       event->scroll.device = _gdk_display->core_pointer;
 
Index: gdk/linux-fb/gdkmouse-fb.c
===================================================================
--- gdk/linux-fb/gdkmouse-fb.c	(revision 19746)
+++ gdk/linux-fb/gdkmouse-fb.c	(working copy)
@@ -236,6 +236,7 @@
   event->scroll.time = GDK_CURRENT_TIME;
   event->scroll.x = x;
   event->scroll.y = y;
+  event->scroll.delta = 1;
   event->scroll.x_root = mouse->x;
   event->scroll.y_root = mouse->y;
   event->scroll.state = gdk_fb_keyboard_modifiers ();
Index: gdk/gdkevents.c
===================================================================
--- gdk/gdkevents.c	(revision 19860)
+++ gdk/gdkevents.c	(working copy)
@@ -316,6 +318,7 @@
       new_event->scroll.y = 0.;
       new_event->scroll.x_root = 0.;
       new_event->scroll.y_root = 0.;
+      new_event->scroll.delta = 0;
       break;
     case GDK_ENTER_NOTIFY:
     case GDK_LEAVE_NOTIFY:
Index: gdk/directfb/gdkevents-directfb.c
===================================================================
--- gdk/directfb/gdkevents-directfb.c	(revision 19746)
+++ gdk/directfb/gdkevents-directfb.c	(working copy)
@@ -870,6 +870,7 @@
             event->scroll.y      = dfbevent->y;
             event->scroll.state  = _gdk_directfb_modifiers;
             event->scroll.device = display->core_pointer;
+	    event->scroll.delta = 1;
           }
       }
       break;
Index: gdk/quartz/gdkevents-quartz.c
===================================================================
--- gdk/quartz/gdkevents-quartz.c	(revision 19860)
+++ gdk/quartz/gdkevents-quartz.c	(working copy)
@@ -1495,7 +1503,8 @@
 static GdkEvent *
 create_scroll_event (GdkWindow          *window, 
                      NSEvent            *nsevent, 
-                     GdkScrollDirection  direction)
+                     GdkScrollDirection  direction,
+		     gdouble             delta)
 {
   GdkEvent *event;
   NSPoint point;
@@ -1512,6 +1521,7 @@
 				      &event->scroll.x_root,
 				      &event->scroll.y_root);
 
+  event->scroll.delta = delta;
   event->scroll.direction = direction;
   event->scroll.device = _gdk_display->core_pointer;
   
@@ -1832,10 +1872,6 @@
 	float dy = [nsevent deltaY];
 	GdkScrollDirection direction;
 
-	/* The delta is how much the mouse wheel has moved. Since there's no such thing in GTK+
-	 * we accomodate by sending a different number of scroll wheel events.
-	 */
-
 	/* First do y events */
 	if (dy < 0.0)
 	  {
@@ -1845,16 +1881,9 @@
 	else
 	  direction = GDK_SCROLL_UP;
 
-	while (dy > 0.0)
-	  {
-	    event = create_scroll_event (window, nsevent, direction);
-	    append_event (event);
-	    dy--;
+	event = create_scroll_event (window, nsevent, direction, dy);
+	append_event (event);
 
-            /* Ignore the delta for now, things get too slow when the events queue up. */
-            break;
-	  }
-
 	/* Now do x events */
 	if (dx < 0.0)
 	  {
@@ -1864,16 +1893,8 @@
 	else
 	  direction = GDK_SCROLL_LEFT;
 
-	while (dx > 0.0)
-	  {
-	    event = create_scroll_event (window, nsevent, direction);
-	    append_event (event);
-	    dx--;
-            
-            /* Ignore the delta for now, things get too slow when the events queue up. */
-            break;
-	  }
-
+	event = create_scroll_event (window, nsevent, direction, dx);
+	append_event (event);
       }
       break;
 
Index: gdk/gdkevents.h
===================================================================
--- gdk/gdkevents.h	(revision 19746)
+++ gdk/gdkevents.h	(working copy)
@@ -324,6 +324,7 @@
   guint32 time;
   gdouble x;
   gdouble y;
+  gdouble delta;
   guint state;
   GdkScrollDirection direction;
   GdkDevice *device;
Index: docs/reference/gdk/tmpl/event_structs.sgml
===================================================================
--- docs/reference/gdk/tmpl/event_structs.sgml	(revision 19746)
+++ docs/reference/gdk/tmpl/event_structs.sgml	(working copy)
@@ -185,6 +185,8 @@
 @time: the time of the event in milliseconds.
 @x: the x coordinate of the pointer relative to the window.
 @y: the y coordinate of the pointer relative to the window.
+@delta: the distance scrolled (1.0 by default and on backends that do
+   not support distance reporting)
 @state: a bit-mask representing the state of the modifier keys (e.g. Control,
 Shift and Alt) and the pointer buttons. See #GdkModifierType.
 @direction: the direction to scroll to (one of %GDK_SCROLL_UP, 
