Index: gtkrange.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkrange.c,v
retrieving revision 1.103
diff -u -r1.103 gtkrange.c
--- gtkrange.c	10 Nov 2004 03:20:11 -0000	1.103
+++ gtkrange.c	16 Mar 2005 16:40:00 -0000
@@ -44,7 +44,8 @@
   PROP_0,
   PROP_UPDATE_POLICY,
   PROP_ADJUSTMENT,
-  PROP_INVERTED
+  PROP_INVERTED,
+  PROP_CLICK_TROUGH_STEPS
 };
 
 enum {
@@ -343,6 +344,14 @@
 							P_("Invert direction slider moves to increase range value"),
                                                          FALSE,
                                                          G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+		  		   PROP_CLICK_TROUGH_STEPS,
+				   g_param_spec_boolean ("click_trough_steps",
+					   		P_("Click-trough steps"),
+							P_("Clicking on the trough moves the slider in steps, rather than warp underneath the mouse"),
+							TRUE,
+							G_PARAM_READWRITE));
   
   gtk_widget_class_install_style_property (widget_class,
 					   g_param_spec_int ("slider_width",
@@ -415,6 +424,9 @@
     case PROP_INVERTED:
       gtk_range_set_inverted (range, g_value_get_boolean (value));
       break;
+    case PROP_CLICK_TROUGH_STEPS:
+      range->click_trough_steps = g_value_get_boolean (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -442,6 +454,8 @@
     case PROP_INVERTED:
       g_value_set_boolean (value, range->inverted);
       break;
+    case PROP_CLICK_TROUGH_STEPS:
+      g_value_set_boolean (value, range->click_trough_steps);
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -471,6 +485,7 @@
   range->layout->grab_location = MOUSE_OUTSIDE;
   range->layout->grab_button = 0;
   range->timer = NULL;  
+  range->click_trough_steps = TRUE;
 }
 
 /**
@@ -1231,7 +1246,7 @@
     gtk_widget_queue_draw (widget);
     
   if (range->layout->mouse_location == MOUSE_TROUGH  &&
-      event->button == 1)
+      event->button == 1 && range->click_trough_steps != FALSE)
     {
       /* button 1 steps by page increment, as with button 2 on a stepper
        */
@@ -1276,7 +1291,7 @@
       return TRUE;
     }
   else if ((range->layout->mouse_location == MOUSE_TROUGH &&
-            event->button == 2) ||
+            (event->button == 2 || range->click_trough_steps == FALSE)) ||
            range->layout->mouse_location == MOUSE_SLIDER)
     {
       gboolean need_value_update = FALSE;
@@ -1286,7 +1301,8 @@
        * On button 2 press, we warp the slider to mouse position,
        * then begin the slider drag.
        */
-      if (event->button == 2)
+      if (event->button == 2 ||
+	  (range->click_trough_steps == FALSE && range->layout->mouse_location == MOUSE_TROUGH))
         {
           gdouble slider_low_value, slider_high_value, new_value;
           
Index: gtkrange.h
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkrange.h,v
retrieving revision 1.29
diff -u -r1.29 gtkrange.h
--- gtkrange.h	27 Aug 2004 02:54:12 -0000	1.29
+++ gtkrange.h	16 Mar 2005 16:40:00 -0000
@@ -98,6 +98,7 @@
   gint slide_initial_coordinate;
   guint update_timeout_id;
   GdkWindow *event_window;
+  guint click_trough_steps : 1;
 };
 
 struct _GtkRangeClass
