Index: gtk/gtkmarshalers.list
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkmarshalers.list,v
retrieving revision 1.58
diff -u -r1.58 gtkmarshalers.list
--- gtk/gtkmarshalers.list	20 Jul 2004 18:50:29 -0000	1.58
+++ gtk/gtkmarshalers.list	26 Jul 2004 03:01:15 -0000
@@ -24,6 +24,7 @@
 BOOLEAN:BOXED
 BOOLEAN:BOXED,BOXED
 BOOLEAN:ENUM
+BOOLEAN:ENUM,DOUBLE
 BOOLEAN:ENUM,INT
 BOOLEAN:OBJECT,UINT,FLAGS
 BOOLEAN:OBJECT,INT,INT,UINT
Index: gtk/gtkrange.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkrange.c,v
retrieving revision 1.97
diff -u -r1.97 gtkrange.c
--- gtk/gtkrange.c	6 Mar 2004 03:38:08 -0000	1.97
+++ gtk/gtkrange.c	26 Jul 2004 03:01:16 -0000
@@ -50,6 +50,7 @@
   VALUE_CHANGED,
   ADJUST_BOUNDS,
   MOVE_SLIDER,
+  CHANGE_VALUE,
   LAST_SIGNAL
 };
 
@@ -172,8 +173,10 @@
 static void          gtk_range_remove_update_timer      (GtkRange      *range);
 static GdkRectangle* get_area                           (GtkRange      *range,
                                                          MouseLocation  location);
-static void          gtk_range_internal_set_value       (GtkRange      *range,
-                                                         gdouble        value);
+static gboolean      gtk_range_internal_set_value       (GtkRange      *range,
+                                                         GtkScrollType  scroll,
+                                                         gdouble        value,
+                                                         gpointer       data);
 static void          gtk_range_update_value             (GtkRange      *range);
 
 
@@ -245,6 +248,7 @@
   widget_class->style_set = gtk_range_style_set;
 
   class->move_slider = gtk_range_move_slider;
+  class->change_value = gtk_range_internal_set_value;
 
   class->slider_detail = "slider";
   class->stepper_detail = "stepper";
@@ -278,6 +282,17 @@
                   G_TYPE_NONE, 1,
                   GTK_TYPE_SCROLL_TYPE);
   
+  signals[CHANGE_VALUE] =
+    g_signal_new ("change_value",
+                  G_TYPE_FROM_CLASS (gobject_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (GtkRangeClass, change_value),
+                  _gtk_boolean_handled_accumulator, NULL,
+                  _gtk_marshal_BOOLEAN__ENUM_DOUBLE,
+                  G_TYPE_BOOLEAN, 2,
+                  GTK_TYPE_SCROLL_TYPE,
+                  G_TYPE_DOUBLE);
+  
   g_object_class_install_property (gobject_class,
                                    PROP_UPDATE_POLICY,
                                    g_param_spec_enum ("update_policy",
@@ -1309,7 +1324,8 @@
   gint delta;
   gint c;
   gdouble new_value;
-  
+  gboolean value_change_handled;
+
   if (range->orientation == GTK_ORIENTATION_VERTICAL)
     delta = mouse_y - range->slide_initial_coordinate;
   else
@@ -1319,7 +1335,8 @@
 
   new_value = coord_to_value (range, c);
   
-  gtk_range_internal_set_value (range, new_value);
+  g_signal_emit (range, signals[CHANGE_VALUE], 0, GTK_SCROLL_JUMP, new_value,
+                 &value_change_handled);
 }
 
 static void stop_scrolling (GtkRange *range)
@@ -1410,9 +1427,13 @@
     {
       GtkAdjustment *adj = GTK_RANGE (range)->adjustment;
       gdouble delta;
+      gboolean value_change_handled;
 
       delta = _gtk_range_get_wheel_delta (range, event->direction);
-      gtk_range_internal_set_value (range, adj->value + delta);
+
+      g_signal_emit (range, signals[CHANGE_VALUE], 0,
+                     GTK_SCROLL_JUMP, adj->value + delta,
+                     &value_change_handled);
       
       /* Policy DELAYED makes sense with scroll events,
        * but DISCONTINUOUS doesn't, so we update immediately
@@ -1552,18 +1573,22 @@
 step_back (GtkRange *range)
 {
   gdouble newval;
+  gboolean value_change_handled;
   
   newval = range->adjustment->value - range->adjustment->step_increment;
-  gtk_range_internal_set_value (range, newval);
+  g_signal_emit (range, signals[CHANGE_VALUE], 0,
+                 GTK_SCROLL_STEP_BACKWARD, newval, &value_change_handled);
 }
 
 static void
 step_forward (GtkRange *range)
 {
   gdouble newval;
+  gboolean value_change_handled;
 
   newval = range->adjustment->value + range->adjustment->step_increment;
-  gtk_range_internal_set_value (range, newval);
+  g_signal_emit (range, signals[CHANGE_VALUE], 0,
+                 GTK_SCROLL_STEP_FORWARD, newval, &value_change_handled);
 }
 
 
@@ -1571,33 +1596,42 @@
 page_back (GtkRange *range)
 {
   gdouble newval;
+  gboolean value_change_handled;
 
   newval = range->adjustment->value - range->adjustment->page_increment;
-  gtk_range_internal_set_value (range, newval);
+  g_signal_emit (range, signals[CHANGE_VALUE], 0,
+                 GTK_SCROLL_PAGE_BACKWARD, newval, &value_change_handled);
 }
 
 static void
 page_forward (GtkRange *range)
 {
   gdouble newval;
+  gboolean value_change_handled;
 
   newval = range->adjustment->value + range->adjustment->page_increment;
-  gtk_range_internal_set_value (range, newval);
+  g_signal_emit (range, signals[CHANGE_VALUE], 0,
+                 GTK_SCROLL_PAGE_FORWARD, newval, &value_change_handled);
 }
 
 static void
 scroll_begin (GtkRange *range)
 {
-  gtk_range_internal_set_value (range, range->adjustment->lower);
+  gboolean value_change_handled;
+  g_signal_emit (range, signals[CHANGE_VALUE], 0,
+                 GTK_SCROLL_START, range->adjustment->lower,
+                 &value_change_handled);
 }
 
 static void
 scroll_end (GtkRange *range)
 {
   gdouble newval;
+  gboolean value_change_handled;
 
   newval = range->adjustment->upper - range->adjustment->page_size;
-  gtk_range_internal_set_value (range, newval);
+  g_signal_emit (range, signals[CHANGE_VALUE], 0, GTK_SCROLL_END, newval,
+                 &value_change_handled);
 }
 
 static void
@@ -2321,9 +2355,11 @@
   return NULL;
 }
 
-static void
-gtk_range_internal_set_value (GtkRange *range,
-                              gdouble   value)
+static gboolean
+gtk_range_internal_set_value (GtkRange     *range,
+                              GtkScrollType scroll,
+                              gdouble       value,
+                              gpointer      data)
 {
   /* potentially adjust the bounds _before we clamp */
   g_signal_emit (range, signals[ADJUST_BOUNDS], 0, value);
@@ -2366,6 +2402,7 @@
           break;
         }
     }
+  return FALSE;
 }
 
 static void
Index: gtk/gtkrange.h
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkrange.h,v
retrieving revision 1.28
diff -u -r1.28 gtkrange.h
--- gtk/gtkrange.h	29 Feb 2004 18:21:57 -0000	1.28
+++ gtk/gtkrange.h	26 Jul 2004 03:01:16 -0000
@@ -120,8 +120,11 @@
   void (* get_range_border) (GtkRange     *range,
                              GtkBorder    *border_);
 
+  gboolean (* change_value) (GtkRange     *range,
+                             GtkScrollType scroll,
+                             gdouble       new_value);
+
   /* Padding for future expansion */
-  void (*_gtk_reserved1) (void);
   void (*_gtk_reserved2) (void);
   void (*_gtk_reserved3) (void);
   void (*_gtk_reserved4) (void);
