+ widget_class->grab_notify = gtk_spin_button_grab_notify;
+ widget_class->state_changed = gtk_spin_button_state_changed;
+
+ entry_class->activate = gtk_spin_button_activate;
+
+ class->input = NULL;
+ class->output = NULL;
+ class->change_value = gtk_spin_button_real_change_value;
+
+ g_object_class_install_property (gobject_class,
+ PROP_ADJUSTMENT,
+ g_param_spec_object ("adjustment",
+ _("Adjustment"),
+ _("The adjustment that holds the value of the spinbutton"),
+ GTK_TYPE_ADJUSTMENT,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_CLIMB_RATE,
+ g_param_spec_double ("climb_rate",
+ _("Climb Rate"),
+ _("The acceleration rate when you hold down a button"),
+ 0.0,
+ G_MAXDOUBLE,
+ 0.0,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_DIGITS,
+ g_param_spec_uint ("digits",
+ _("Digits"),
+ _("The number of decimal places to display"),
+ 0,
+ MAX_DIGITS,
+ 0,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_SNAP_TO_TICKS,
+ g_param_spec_boolean ("snap_to_ticks",
+ _("Snap to Ticks"),
+ _("Whether erroneous values are automatically changed to a spin button's nearest step increment"),
+ FALSE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_NUMERIC,
+ g_param_spec_boolean ("numeric",
+ _("Numeric"),
+ _("Whether non-numeric characters should be ignored"),
+ FALSE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_WRAP,
+ g_param_spec_boolean ("wrap",
+ _("Wrap"),
+ _("Whether a spin button should wrap upon reaching its limits"),
+ FALSE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_UPDATE_POLICY,
+ g_param_spec_enum ("update_policy",
+ _("Update Policy"),
+ _("Whether the spin button should update always, or only when the value is legal"),
+ GTK_TYPE_SPIN_BUTTON_UPDATE_POLICY,
+ GTK_UPDATE_ALWAYS,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class,
+ PROP_VALUE,
+ g_param_spec_double ("value",
+ _("Value"),
+ _("Reads the current value, or sets a new value"),
+ -G_MAXDOUBLE,
+ G_MAXDOUBLE,
+ 0.0,
+ G_PARAM_READWRITE));
+
+ gtk_widget_class_install_style_property_parser (widget_class,
+ g_param_spec_enum ("shadow_type", "Shadow Type", NULL,
+ GTK_TYPE_SHADOW_TYPE,
+ GTK_SHADOW_IN,
+ G_PARAM_READABLE),
+ gtk_rc_property_parse_enum);
+ spinbutton_signals[INPUT] =
+ gtk_signal_new ("input",
+ GTK_RUN_LAST,
+ GTK_CLASS_TYPE (object_class),
+ GTK_SIGNAL_OFFSET (GtkSpinButtonClass, input),
+ _gtk_marshal_INT__POINTER,
+ GTK_TYPE_INT, 1, GTK_TYPE_POINTER);
+
+ spinbutton_signals[OUTPUT] =
+ g_signal_new ("output",
+ G_TYPE_FROM_CLASS(object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(GtkSpinButtonClass, output),
+ _gtk_boolean_handled_accumulator, NULL,
+ _gtk_marshal_BOOLEAN__VOID,
+ G_TYPE_BOOLEAN, 0);
+
+ spinbutton_signals[VALUE_CHANGED] =
+ gtk_signal_new ("value_changed",
+ GTK_RUN_LAST,
+ GTK_CLASS_TYPE (object_class),
+ GTK_SIGNAL_OFFSET (GtkSpinButtonClass, value_changed),
+ _gtk_marshal_VOID__VOID,
+ GTK_TYPE_NONE, 0);
+
+ /* Action signals */
+ spinbutton_signals[CHANGE_VALUE] =
+ g_signal_new ("change_value",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GtkSpinButtonClass, change_value),
+ NULL, NULL,
+ _gtk_marshal_VOID__ENUM,
+ G_TYPE_NONE, 1,
+ GTK_TYPE_SCROLL_TYPE);
+
+ binding_set = gtk_binding_set_by_class (class);
+
+ add_spin_binding (binding_set, GDK_Up, 0, GTK_SCROLL_STEP_UP);
+ add_spin_binding (binding_set, GDK_KP_Up, 0, GTK_SCROLL_STEP_UP);
+ add_spin_binding (binding_set, GDK_Down, 0, GTK_SCROLL_STEP_DOWN);
+ add_spin_binding (binding_set, GDK_KP_Down, 0, GTK_SCROLL_STEP_DOWN);
+ add_spin_binding (binding_set, GDK_Page_Up, 0, GTK_SCROLL_PAGE_UP);
+ add_spin_binding (binding_set, GDK_Page_Down, 0, GTK_SCROLL_PAGE_DOWN);
+ add_spin_binding (binding_set, GDK_Page_Up, GDK_CONTROL_MASK, GTK_SCROLL_END);
+ add_spin_binding (binding_set, GDK_Page_Down, GDK_CONTROL_MASK, GTK_SCROLL_START);
+}