📄 gtkspinbutton.c
字号:
g_return_if_fail (GTK_IS_SPIN_BUTTON (widget)); g_return_if_fail (area != NULL); if (GTK_WIDGET_DRAWABLE (widget)) gtk_spin_button_paint (widget, area);}static gintgtk_spin_button_expose (GtkWidget *widget, GdkEventExpose *event){ g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (GTK_WIDGET_DRAWABLE (widget)) gtk_spin_button_paint (widget, &event->area); return FALSE;}static voidgtk_spin_button_draw_arrow (GtkSpinButton *spin_button, guint arrow){ GtkStateType state_type; GtkShadowType shadow_type; GtkWidget *widget; gint x; gint y; g_return_if_fail (spin_button != NULL); g_return_if_fail (GTK_IS_SPIN_BUTTON (spin_button)); widget = GTK_WIDGET (spin_button); if (GTK_WIDGET_DRAWABLE (spin_button)) { if (!spin_button->wrap && (((arrow == GTK_ARROW_UP && (spin_button->adjustment->upper - spin_button->adjustment->value <= EPSILON))) || ((arrow == GTK_ARROW_DOWN && (spin_button->adjustment->value - spin_button->adjustment->lower <= EPSILON))))) { shadow_type = GTK_SHADOW_ETCHED_IN; state_type = GTK_STATE_NORMAL; } else { if (spin_button->in_child == arrow) { if (spin_button->click_child == arrow) state_type = GTK_STATE_ACTIVE; else state_type = GTK_STATE_PRELIGHT; } else state_type = GTK_STATE_NORMAL; if (spin_button->click_child == arrow) shadow_type = GTK_SHADOW_IN; else shadow_type = GTK_SHADOW_OUT; } if (arrow == GTK_ARROW_UP) { if (spin_button->shadow_type != GTK_SHADOW_NONE) { x = widget->style->klass->xthickness; y = widget->style->klass->ythickness; } else { x = widget->style->klass->xthickness - 1; y = widget->style->klass->ythickness - 1; } gtk_paint_arrow (widget->style, spin_button->panel, state_type, shadow_type, NULL, widget, "spinbutton", arrow, TRUE, x, y, ARROW_SIZE, widget->requisition.height / 2 - widget->style->klass->ythickness); } else { if (spin_button->shadow_type != GTK_SHADOW_NONE) { x = widget->style->klass->xthickness; y = widget->requisition.height / 2; } else { x = widget->style->klass->xthickness - 1; y = widget->requisition.height / 2 + 1; } gtk_paint_arrow (widget->style, spin_button->panel, state_type, shadow_type, NULL, widget, "spinbutton", arrow, TRUE, x, y, ARROW_SIZE, widget->requisition.height / 2 - widget->style->klass->ythickness); } }}static gintgtk_spin_button_enter_notify (GtkWidget *widget, GdkEventCrossing *event){ GtkSpinButton *spin; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); spin = GTK_SPIN_BUTTON (widget); if (event->window == spin->panel) { gint x; gint y; gdk_window_get_pointer (spin->panel, &x, &y, NULL); if (y <= widget->requisition.height / 2) { spin->in_child = GTK_ARROW_UP; if (spin->click_child == 2) gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP); } else { spin->in_child = GTK_ARROW_DOWN; if (spin->click_child == 2) gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN); } } return FALSE;}static gintgtk_spin_button_leave_notify (GtkWidget *widget, GdkEventCrossing *event){ GtkSpinButton *spin; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); spin = GTK_SPIN_BUTTON (widget); if (event->window == spin->panel && spin->click_child == 2) { if (spin->in_child == GTK_ARROW_UP) { spin->in_child = 2; gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP); } else { spin->in_child = 2; gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN); } } return FALSE;}static gintgtk_spin_button_focus_out (GtkWidget *widget, GdkEventFocus *event){ g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (GTK_EDITABLE (widget)->editable) gtk_spin_button_update (GTK_SPIN_BUTTON (widget)); return GTK_WIDGET_CLASS (parent_class)->focus_out_event (widget, event);}static gintgtk_spin_button_button_press (GtkWidget *widget, GdkEventButton *event){ GtkSpinButton *spin; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); spin = GTK_SPIN_BUTTON (widget); if (!spin->button) { if (event->window == spin->panel) { if (!GTK_WIDGET_HAS_FOCUS (widget)) gtk_widget_grab_focus (widget); gtk_grab_add (widget); spin->button = event->button; if (GTK_EDITABLE (widget)->editable) gtk_spin_button_update (spin); if (event->y <= widget->requisition.height / 2) { spin->click_child = GTK_ARROW_UP; if (event->button == 1) { gtk_spin_button_real_spin (spin, spin->adjustment->step_increment); if (!spin->timer) { spin->timer_step = spin->adjustment->step_increment; spin->need_timer = TRUE; spin->timer = gtk_timeout_add (SPIN_BUTTON_INITIAL_TIMER_DELAY, (GtkFunction) gtk_spin_button_timer, (gpointer) spin); } } else if (event->button == 2) { gtk_spin_button_real_spin (spin, spin->adjustment->page_increment); if (!spin->timer) { spin->timer_step = spin->adjustment->page_increment; spin->need_timer = TRUE; spin->timer = gtk_timeout_add (SPIN_BUTTON_INITIAL_TIMER_DELAY, (GtkFunction) gtk_spin_button_timer, (gpointer) spin); } } gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP); } else { spin->click_child = GTK_ARROW_DOWN; if (event->button == 1) { gtk_spin_button_real_spin (spin, -spin->adjustment->step_increment); if (!spin->timer) { spin->timer_step = spin->adjustment->step_increment; spin->need_timer = TRUE; spin->timer = gtk_timeout_add (SPIN_BUTTON_INITIAL_TIMER_DELAY, (GtkFunction) gtk_spin_button_timer, (gpointer) spin); } } else if (event->button == 2) { gtk_spin_button_real_spin (spin, -spin->adjustment->page_increment); if (!spin->timer) { spin->timer_step = spin->adjustment->page_increment; spin->need_timer = TRUE; spin->timer = gtk_timeout_add (SPIN_BUTTON_INITIAL_TIMER_DELAY, (GtkFunction) gtk_spin_button_timer, (gpointer) spin); } } gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN); } } else GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event); } return FALSE;}static gintgtk_spin_button_button_release (GtkWidget *widget, GdkEventButton *event){ GtkSpinButton *spin; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); spin = GTK_SPIN_BUTTON (widget); if (event->button == spin->button) { guint click_child; if (spin->timer) { gtk_timeout_remove (spin->timer); spin->timer = 0; spin->timer_calls = 0; spin->need_timer = FALSE; } if (event->button == 3) { if (event->y >= 0 && event->x >= 0 && event->y <= widget->requisition.height && event->x <= ARROW_SIZE + 2 * widget->style->klass->xthickness) { if (spin->click_child == GTK_ARROW_UP && event->y <= widget->requisition.height / 2) { gfloat diff; diff = spin->adjustment->upper - spin->adjustment->value; if (diff > EPSILON) gtk_spin_button_real_spin (spin, diff); } else if (spin->click_child == GTK_ARROW_DOWN && event->y > widget->requisition.height / 2) { gfloat diff; diff = spin->adjustment->value - spin->adjustment->lower; if (diff > EPSILON) gtk_spin_button_real_spin (spin, -diff); } } } gtk_grab_remove (widget); click_child = spin->click_child; spin->click_child = 2; spin->button = 0; gtk_spin_button_draw_arrow (spin, click_child); } else GTK_WIDGET_CLASS (parent_class)->button_release_event (widget, event); return FALSE;}static gintgtk_spin_button_motion_notify (GtkWidget *widget, GdkEventMotion *event){ GtkSpinButton *spin; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); spin = GTK_SPIN_BUTTON (widget); if (spin->button) return FALSE; if (event->window == spin->panel) { gint y; y = event->y; if (event->is_hint) gdk_window_get_pointer (spin->panel, NULL, &y, NULL); if (y <= widget->requisition.height / 2 && spin->in_child == GTK_ARROW_DOWN) { spin->in_child = GTK_ARROW_UP; gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP); gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN); } else if (y > widget->requisition.height / 2 && spin->in_child == GTK_ARROW_UP) { spin->in_child = GTK_ARROW_DOWN; gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP); gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN); } return FALSE; } return GTK_WIDGET_CLASS (parent_class)->motion_notify_event (widget, event);}static gintgtk_spin_button_timer (GtkSpinButton *spin_button){ gboolean retval = FALSE; GDK_THREADS_ENTER (); if (spin_button->timer) { if (spin_button->click_child == GTK_ARROW_UP) gtk_spin_button_real_spin (spin_button, spin_button->timer_step); else gtk_spin_button_real_spin (spin_button, -spin_button->timer_step); if (spin_button->need_timer) { spin_button->need_timer = FALSE; spin_button->timer = gtk_timeout_add (SPIN_BUTTON_TIMER_DELAY, (GtkFunction) gtk_spin_button_timer, (gpointer) spin_button); } else { if (spin_button->climb_rate > 0.0 && spin_button->timer_step < spin_button->adjustment->page_increment) { if (spin_button->timer_calls < MAX_TIMER_CALLS) spin_button->timer_calls++; else { spin_button->timer_calls = 0; spin_button->timer_step += spin_button->climb_rate; } } retval = TRUE; } } GDK_THREADS_LEAVE (); return retval;}static voidgtk_spin_button_value_changed (GtkAdjustment *adjustment, GtkSpinButton *spin_button){ char buf[MAX_TEXT_LENGTH]; g_return_if_fail (adjustment != NULL); g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); sprintf (buf, "%0.*f", spin_button->digits, adjustment->value); gtk_entry_set_text (GTK_ENTRY (spin_button), buf);}static gintgtk_spin_button_key_press (GtkWidget *widget, GdkEventKey *event){ GtkSpinButton *spin; gint key; gboolean key_repeat = FALSE; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_SPIN_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); spin = GTK_SPIN_BUTTON (widget); key = event->keyval; key_repeat = (event->time == spin->ev_time); if (GTK_EDITABLE (widget)->editable && (key == GDK_Up || key == GDK_Down || key == GDK_Page_Up || key == GDK_Page_Down)) gtk_spin_button_update (spin); switch (key) { case GDK_Up: if (GTK_WIDGET_HAS_FOCUS (widget)) { gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "key_press_event"); if (!key_repeat) spin->timer_step = spin->adjustment->step_increment; gtk_spin_button_real_spin (spin, spin->timer_step); if (key_repeat) { if (spin->climb_rate > 0.0 && spin->timer_step < spin->adjustment->page_increment) { if (spin->timer_calls < MAX_TIMER_CALLS) spin->timer_calls++; else { spin->timer_calls = 0; spin->timer_step += spin->climb_rate; } } } return TRUE; } return FALSE; case GDK_Down: if (GTK_WIDGET_HAS_FOCUS (widget)) { gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "key_press_event"); if (!key_repeat) spin->timer_step = spin->adjustment->step_increment; gtk_spin_button_real_spin (spin, -spin->timer_step); if (key_repeat) { if (spin->climb_rate > 0.0 && spin->timer_step < spin->adjustment->page_increment) { if (spin->timer_calls < MAX_TIMER_CALLS) spin->timer_calls++; else { spin->timer_calls = 0; spin->timer_step += spin->climb_rate; } } } return TRUE; } return FALSE; case GDK_Page_Up: if (event->state & GDK_CONTROL_MASK) { gfloat diff = spin->adjustment->upper - spin->adjustment->value; if (diff > EPSILON) gtk_spin_button_real_spin (spin, diff); } else gtk_spin_button_real_spin (spin, spin->adjustment->page_increment);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -