📄 gtkbutton.c
字号:
requisition->width += child_requisition.width; requisition->height += child_requisition.height; }}static voidgtk_button_size_allocate (GtkWidget *widget, GtkAllocation *allocation){ GtkButton *button; GtkAllocation child_allocation; gint border_width; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_BUTTON (widget)); g_return_if_fail (allocation != NULL); widget->allocation = *allocation; border_width = GTK_CONTAINER (widget)->border_width; if (GTK_WIDGET_REALIZED (widget)) gdk_window_move_resize (widget->window, widget->allocation.x + border_width, widget->allocation.y + border_width, widget->allocation.width - border_width * 2, widget->allocation.height - border_width * 2); button = GTK_BUTTON (widget); if (GTK_BIN (button)->child && GTK_WIDGET_VISIBLE (GTK_BIN (button)->child)) { child_allocation.x = (CHILD_SPACING + GTK_WIDGET (widget)->style->klass->xthickness); child_allocation.y = (CHILD_SPACING + GTK_WIDGET (widget)->style->klass->ythickness); child_allocation.width = MAX (1, (gint)widget->allocation.width - child_allocation.x * 2 - border_width * 2); child_allocation.height = MAX (1, (gint)widget->allocation.height - child_allocation.y * 2 - border_width * 2); if (GTK_WIDGET_CAN_DEFAULT (button)) { child_allocation.x += (GTK_WIDGET (widget)->style->klass->xthickness + DEFAULT_LEFT_POS); child_allocation.y += (GTK_WIDGET (widget)->style->klass->ythickness + DEFAULT_TOP_POS); child_allocation.width = MAX (1, (gint)child_allocation.width - (gint)(GTK_WIDGET (widget)->style->klass->xthickness * 2 + DEFAULT_SPACING)); child_allocation.height = MAX (1, (gint)child_allocation.height - (gint)(GTK_WIDGET (widget)->style->klass->xthickness * 2 + DEFAULT_SPACING)); } gtk_widget_size_allocate (GTK_BIN (button)->child, &child_allocation); }}/* * +------------------------------------------------+ * | BORDER | * | +------------------------------------------+ | * | |\\\\\\\\\\\\\\\\DEFAULT\\\\\\\\\\\\\\\\\ | | * | |\\+------------------------------------+ | | * | |\\| | SPACING 3 | | | | * | |\\| +--------------------------------+ | | | * | |\\| |########## FOCUS ###############| | | | * | |\\| |#+----------------------------+#| | | | * | |\\| |#| RELIEF \|#| | | | * | |\\| |#| +-----------------------+\|#| | | | * | |\\|1|#| + THE TEXT +\|#|2| | | * | |\\| |#| +-----------------------+\|#| | | | * | |\\| |#| \\\\\ ythickness \\\\\\\\\\|#| | | | * | |\\| |#+----------------------------+#| | | | * | |\\| |########### 1 ##################| | | | * | |\\| +--------------------------------+ | | | * | |\\| | default spacing 4 | | | | * | |\\+------------------------------------+ | | * | |\ ythickness | | * | +------------------------------------------+ | * | border_width | * +------------------------------------------------+ */static voidgtk_button_paint (GtkWidget *widget, GdkRectangle *area){ GtkButton *button; GtkShadowType shadow_type; gint width, height; gint x, y; if (GTK_WIDGET_DRAWABLE (widget)) { button = GTK_BUTTON (widget); x = 0; y = 0; width = widget->allocation.width - GTK_CONTAINER (widget)->border_width * 2; height = widget->allocation.height - GTK_CONTAINER (widget)->border_width * 2; gdk_window_set_back_pixmap (widget->window, NULL, TRUE); gdk_window_clear_area (widget->window, area->x, area->y, area->width, area->height); if (GTK_WIDGET_HAS_DEFAULT (widget) && GTK_BUTTON (widget)->relief == GTK_RELIEF_NORMAL) { gtk_paint_box (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_IN, area, widget, "buttondefault", x, y, width, height); } if (GTK_WIDGET_CAN_DEFAULT (widget)) { x += widget->style->klass->xthickness; y += widget->style->klass->ythickness; width -= 2 * x + DEFAULT_SPACING; height -= 2 * y + DEFAULT_SPACING; x += DEFAULT_LEFT_POS; y += DEFAULT_TOP_POS; } if (GTK_WIDGET_HAS_FOCUS (widget)) { x += 1; y += 1; width -= 2; height -= 2; } if (GTK_WIDGET_STATE (widget) == GTK_STATE_ACTIVE) shadow_type = GTK_SHADOW_IN; else shadow_type = GTK_SHADOW_OUT; if ((button->relief != GTK_RELIEF_NONE) || ((GTK_WIDGET_STATE(widget) != GTK_STATE_NORMAL) && (GTK_WIDGET_STATE(widget) != GTK_STATE_INSENSITIVE))) gtk_paint_box (widget->style, widget->window, GTK_WIDGET_STATE (widget), shadow_type, area, widget, "button", x, y, width, height); if (GTK_WIDGET_HAS_FOCUS (widget)) { x -= 1; y -= 1; width += 2; height += 2; gtk_paint_focus (widget->style, widget->window, area, widget, "button", x, y, width - 1, height - 1); } }}static voidgtk_button_draw (GtkWidget *widget, GdkRectangle *area){ GtkButton *button; GdkRectangle child_area; GdkRectangle tmp_area; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_BUTTON (widget)); g_return_if_fail (area != NULL); if (GTK_WIDGET_DRAWABLE (widget)) { button = GTK_BUTTON (widget); tmp_area = *area; tmp_area.x -= GTK_CONTAINER (button)->border_width; tmp_area.y -= GTK_CONTAINER (button)->border_width; gtk_button_paint (widget, &tmp_area); if (GTK_BIN (button)->child && gtk_widget_intersect (GTK_BIN (button)->child, &tmp_area, &child_area)) gtk_widget_draw (GTK_BIN (button)->child, &child_area); }}static voidgtk_button_draw_focus (GtkWidget *widget){ gtk_widget_draw (widget, NULL);}static voidgtk_button_draw_default (GtkWidget *widget){ gtk_widget_draw (widget, NULL);}static gintgtk_button_expose (GtkWidget *widget, GdkEventExpose *event){ GtkBin *bin; GdkEventExpose child_event; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (GTK_WIDGET_DRAWABLE (widget)) { bin = GTK_BIN (widget); gtk_button_paint (widget, &event->area); child_event = *event; if (bin->child && GTK_WIDGET_NO_WINDOW (bin->child) && gtk_widget_intersect (bin->child, &event->area, &child_event.area)) gtk_widget_event (bin->child, (GdkEvent*) &child_event); } return FALSE;}static gintgtk_button_button_press (GtkWidget *widget, GdkEventButton *event){ GtkButton *button; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (event->type == GDK_BUTTON_PRESS) { button = GTK_BUTTON (widget); if (!GTK_WIDGET_HAS_FOCUS (widget)) gtk_widget_grab_focus (widget); if (event->button == 1) { gtk_grab_add (GTK_WIDGET (button)); gtk_button_pressed (button); } } return TRUE;}static gintgtk_button_button_release (GtkWidget *widget, GdkEventButton *event){ GtkButton *button; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (event->button == 1) { button = GTK_BUTTON (widget); gtk_grab_remove (GTK_WIDGET (button)); gtk_button_released (button); } return TRUE;}static gintgtk_button_enter_notify (GtkWidget *widget, GdkEventCrossing *event){ GtkButton *button; GtkWidget *event_widget; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); button = GTK_BUTTON (widget); event_widget = gtk_get_event_widget ((GdkEvent*) event); if ((event_widget == widget) && (event->detail != GDK_NOTIFY_INFERIOR)) { button->in_button = TRUE; gtk_button_enter (button); } return FALSE;}static gintgtk_button_leave_notify (GtkWidget *widget, GdkEventCrossing *event){ GtkButton *button; GtkWidget *event_widget; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); button = GTK_BUTTON (widget); event_widget = gtk_get_event_widget ((GdkEvent*) event); if ((event_widget == widget) && (event->detail != GDK_NOTIFY_INFERIOR)) { button->in_button = FALSE; gtk_button_leave (button); } return FALSE;}static gintgtk_button_focus_in (GtkWidget *widget, GdkEventFocus *event){ g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS); gtk_widget_draw_focus (widget); return FALSE;}static gintgtk_button_focus_out (GtkWidget *widget, GdkEventFocus *event){ g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_BUTTON (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS); gtk_widget_draw_focus (widget); return FALSE;}static voidgtk_button_add (GtkContainer *container, GtkWidget *widget){ g_return_if_fail (container != NULL); g_return_if_fail (widget != NULL); if (GTK_CONTAINER_CLASS (parent_class)->add) GTK_CONTAINER_CLASS (parent_class)->add (container, widget); GTK_BUTTON (container)->child = GTK_BIN (container)->child;}static voidgtk_button_remove (GtkContainer *container, GtkWidget *widget){ g_return_if_fail (container != NULL); g_return_if_fail (widget != NULL); if (GTK_CONTAINER_CLASS (parent_class)->remove) GTK_CONTAINER_CLASS (parent_class)->remove (container, widget); GTK_BUTTON (container)->child = GTK_BIN (container)->child;}static voidgtk_real_button_pressed (GtkButton *button){ GtkStateType new_state; g_return_if_fail (button != NULL); g_return_if_fail (GTK_IS_BUTTON (button)); button->button_down = TRUE; new_state = (button->in_button ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL); if (GTK_WIDGET_STATE (button) != new_state) { gtk_widget_set_state (GTK_WIDGET (button), new_state); gtk_widget_queue_draw (GTK_WIDGET (button)); }}static voidgtk_real_button_released (GtkButton *button){ GtkStateType new_state; g_return_if_fail (button != NULL); g_return_if_fail (GTK_IS_BUTTON (button)); if (button->button_down) { button->button_down = FALSE; if (button->in_button) gtk_button_clicked (button); new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL); if (GTK_WIDGET_STATE (button) != new_state) { gtk_widget_set_state (GTK_WIDGET (button), new_state); /* We _draw () instead of queue_draw so that if the operation * blocks, the label doesn't vanish. */ gtk_widget_draw (GTK_WIDGET (button), NULL); } }}static voidgtk_real_button_enter (GtkButton *button){ GtkStateType new_state; g_return_if_fail (button != NULL); g_return_if_fail (GTK_IS_BUTTON (button)); new_state = (button->button_down ? GTK_STATE_ACTIVE : GTK_STATE_PRELIGHT); if (GTK_WIDGET_STATE (button) != new_state) { gtk_widget_set_state (GTK_WIDGET (button), new_state); gtk_widget_queue_draw (GTK_WIDGET (button)); }}static voidgtk_real_button_leave (GtkButton *button){ g_return_if_fail (button != NULL); g_return_if_fail (GTK_IS_BUTTON (button)); if (GTK_WIDGET_STATE (button) != GTK_STATE_NORMAL) { gtk_widget_set_state (GTK_WIDGET (button), GTK_STATE_NORMAL); gtk_widget_queue_draw (GTK_WIDGET (button)); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -