📄 gtktogglebutton.c
字号:
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, "togglebuttondefault", 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) || toggle_button->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, "togglebutton", 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, "togglebutton", x, y, width - 1, height - 1); } }}static voidgtk_toggle_button_size_allocate (GtkWidget *widget, GtkAllocation *allocation){ if (!GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_CLASS (parent_class)->size_allocate) GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation);}static gintgtk_toggle_button_expose (GtkWidget *widget, GdkEventExpose *event){ if (!GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_CLASS (parent_class)->expose_event) return GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); else return FALSE;}static voidgtk_toggle_button_draw (GtkWidget *widget, GdkRectangle *area){ GdkRectangle child_area; GdkRectangle tmp_area; GtkBin *bin; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TOGGLE_BUTTON (widget)); g_return_if_fail (area != NULL); bin = GTK_BIN (widget); if (GTK_WIDGET_DRAWABLE (widget) && !GTK_WIDGET_NO_WINDOW (widget)) { tmp_area = *area; tmp_area.x -= GTK_CONTAINER (widget)->border_width; tmp_area.y -= GTK_CONTAINER (widget)->border_width; gtk_toggle_button_paint (widget, &tmp_area); if (bin->child && gtk_widget_intersect (bin->child, &tmp_area, &child_area)) gtk_widget_draw (bin->child, &child_area); }}static voidgtk_toggle_button_pressed (GtkButton *button){ GtkToggleButton *toggle_button; GtkStateType new_state; g_return_if_fail (button != NULL); g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button)); toggle_button = GTK_TOGGLE_BUTTON (button); button->button_down = TRUE; if (toggle_button->active) new_state = (button->in_button ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE); else 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);}static voidgtk_toggle_button_released (GtkButton *button){ GtkToggleButton *toggle_button; GtkStateType new_state; g_return_if_fail (button != NULL); g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button)); if (button->button_down) { toggle_button = GTK_TOGGLE_BUTTON (button); button->button_down = FALSE; if (button->in_button) { gtk_button_clicked (button); } else { if (toggle_button->active) new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_ACTIVE); else 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); } }}static voidgtk_toggle_button_clicked (GtkButton *button){ GtkToggleButton *toggle_button; GtkStateType new_state; g_return_if_fail (button != NULL); g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button)); toggle_button = GTK_TOGGLE_BUTTON (button); toggle_button->active = !toggle_button->active; gtk_toggle_button_toggled (toggle_button); if (toggle_button->active) new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_ACTIVE); else 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); else gtk_widget_queue_draw (GTK_WIDGET (button));}static voidgtk_toggle_button_enter (GtkButton *button){ GtkToggleButton *toggle_button; GtkStateType new_state; g_return_if_fail (button != NULL); g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button)); toggle_button = GTK_TOGGLE_BUTTON (button); if (toggle_button->active) new_state = (button->button_down ? GTK_STATE_NORMAL : GTK_STATE_PRELIGHT); else 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);}static voidgtk_toggle_button_leave (GtkButton *button){ GtkToggleButton *toggle_button; GtkStateType new_state; g_return_if_fail (button != NULL); g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button)); toggle_button = GTK_TOGGLE_BUTTON (button); new_state = (toggle_button->active ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL); if (GTK_WIDGET_STATE (button) != new_state) gtk_widget_set_state (GTK_WIDGET (button), new_state);}static voidgtk_toggle_button_realize (GtkWidget *widget){ GtkToggleButton *toggle_button; GdkWindowAttr attributes; gint attributes_mask; gint border_width; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TOGGLE_BUTTON (widget)); toggle_button = GTK_TOGGLE_BUTTON (widget); GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); border_width = GTK_CONTAINER (widget)->border_width; attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x + border_width; attributes.y = widget->allocation.y + border_width; attributes.width = widget->allocation.width - border_width * 2; attributes.height = widget->allocation.height - border_width * 2; attributes.event_mask = gtk_widget_get_events (widget); attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); if (GTK_WIDGET_NO_WINDOW (widget)) { attributes.wclass = GDK_INPUT_ONLY; attributes_mask = GDK_WA_X | GDK_WA_Y; widget->window = gtk_widget_get_parent_window (widget); gdk_window_ref (widget->window); toggle_button->event_window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gdk_window_set_user_data (toggle_button->event_window, toggle_button); } else { attributes.wclass = GDK_INPUT_OUTPUT; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gdk_window_set_user_data (widget->window, toggle_button); } widget->style = gtk_style_attach (widget->style, widget->window); if (!GTK_WIDGET_NO_WINDOW (widget)) gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);} static voidgtk_toggle_button_unrealize (GtkWidget *widget){ GtkToggleButton *toggle_button; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TOGGLE_BUTTON (widget)); toggle_button = GTK_TOGGLE_BUTTON (widget); if (GTK_WIDGET_NO_WINDOW (widget)) { gdk_window_set_user_data (toggle_button->event_window, NULL); gdk_window_destroy (toggle_button->event_window); toggle_button->event_window = NULL; } if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);}static voidgtk_toggle_button_map (GtkWidget *widget){ g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TOGGLE_BUTTON (widget)); if (GTK_WIDGET_NO_WINDOW (widget)) gdk_window_show (GTK_TOGGLE_BUTTON (widget)->event_window); GTK_WIDGET_CLASS (parent_class)->map (widget);}static voidgtk_toggle_button_unmap (GtkWidget *widget){ g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TOGGLE_BUTTON (widget)); if (GTK_WIDGET_NO_WINDOW (widget)) gdk_window_hide (GTK_TOGGLE_BUTTON (widget)->event_window); GTK_WIDGET_CLASS (parent_class)->unmap (widget);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -