+ 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",
+ P_("Adjustment"),
+ P_("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",
+ P_("Climb Rate"),
+ P_("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",
+ P_("Digits"),
+ P_("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",
+ P_("Snap to Ticks"),
+ P_("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",
+ P_("Numeric"),
+ P_("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",
+ P_("Wrap"),
+ P_("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",
+ P_("Update Policy"),
+ P_("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",
+ P_("Value"),
+ P_("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",
+ P_("Style of bevel around the spin button"),
+ GTK_TYPE_SHADOW_TYPE,
+ GTK_SHADOW_IN,
+ G_PARAM_READABLE),
+ gtk_rc_property_parse_enum);
+ spinbutton_signals[INPUT] =
+ g_signal_new ("input",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GtkSpinButtonClass, input),
+ NULL, NULL,
+ _gtk_marshal_INT__POINTER,
+ G_TYPE_INT, 1,
+ G_TYPE_POINTER);
+
+ spinbutton_signals[OUTPUT] =
+ g_signal_new ("output",
+ G_TYPE_FROM_CLASS (gobject_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] =
+ g_signal_new ("value_changed",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GtkSpinButtonClass, value_changed),
+ NULL, NULL,
+ _gtk_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ /* Action signals */
+ spinbutton_signals[CHANGE_VALUE] =
+ g_signal_new ("change_value",
+ G_TYPE_FROM_CLASS (gobject_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);
+}