📄 gtkoptionmenu.c
字号:
OPTION_INDICATOR_WIDTH - OPTION_INDICATOR_SPACING * 4, button_area.y + (button_area.height - OPTION_INDICATOR_HEIGHT) / 2, OPTION_INDICATOR_WIDTH, OPTION_INDICATOR_HEIGHT); if (GTK_WIDGET_HAS_FOCUS (widget)) gtk_paint_focus (widget->style, widget->window, area, widget, "button", button_area.x - 1, button_area.y - 1, button_area.width + 1, button_area.height + 1); }}static voidgtk_option_menu_draw (GtkWidget *widget, GdkRectangle *area){ GtkWidget *child; GdkRectangle child_area; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_OPTION_MENU (widget)); g_return_if_fail (area != NULL); if (GTK_WIDGET_DRAWABLE (widget)) { gtk_option_menu_paint (widget, area); child = GTK_BIN (widget)->child; if (child && gtk_widget_intersect (child, area, &child_area)) gtk_widget_draw (child, &child_area); }}static gintgtk_option_menu_expose (GtkWidget *widget, GdkEventExpose *event){ GtkWidget *child; GdkEventExpose child_event; gint remove_child; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (GTK_WIDGET_DRAWABLE (widget)) { gtk_option_menu_paint (widget, &event->area); /* The following code tries to draw the child in two places at * once. It fails miserably for several reasons * * - If the child is not no-window, removing generates * more expose events. Bad, bad, bad. * * - Even if the child is no-window, removing it now (properly) * clears the space where it was, so it does no good */ #if 0 remove_child = FALSE; child = GTK_BUTTON (widget)->child; if (!child) { if (!GTK_OPTION_MENU (widget)->menu) return FALSE; gtk_option_menu_update_contents (GTK_OPTION_MENU (widget)); child = GTK_BUTTON (widget)->child; if (!child) return FALSE; remove_child = TRUE; } child_event = *event; if (GTK_WIDGET_NO_WINDOW (child) && gtk_widget_intersect (child, &event->area, &child_event.area)) gtk_widget_event (child, (GdkEvent*) &child_event); if (remove_child) gtk_option_menu_remove_contents (GTK_OPTION_MENU (widget));#else remove_child = FALSE; child = GTK_BIN (widget)->child; child_event = *event; if (child && GTK_WIDGET_NO_WINDOW (child) && gtk_widget_intersect (child, &event->area, &child_event.area)) gtk_widget_event (child, (GdkEvent*) &child_event);#endif /* 0 */ } return FALSE;}static gintgtk_option_menu_button_press (GtkWidget *widget, GdkEventButton *event){ GtkOptionMenu *option_menu; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); option_menu = GTK_OPTION_MENU (widget); if ((event->type == GDK_BUTTON_PRESS) && (event->button == 1)) { gtk_option_menu_remove_contents (option_menu); gtk_menu_popup (GTK_MENU (option_menu->menu), NULL, NULL, gtk_option_menu_position, option_menu, event->button, event->time); return TRUE; } return FALSE;}static gintgtk_option_menu_key_press (GtkWidget *widget, GdkEventKey *event){ GtkOptionMenu *option_menu; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); option_menu = GTK_OPTION_MENU (widget); switch (event->keyval) { case GDK_space: gtk_option_menu_remove_contents (option_menu); gtk_menu_popup (GTK_MENU (option_menu->menu), NULL, NULL, gtk_option_menu_position, option_menu, 0, event->time); return TRUE; } return FALSE;}static voidgtk_option_menu_deactivate (GtkMenuShell *menu_shell, GtkOptionMenu *option_menu){ g_return_if_fail (menu_shell != NULL); g_return_if_fail (option_menu != NULL); g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); gtk_option_menu_update_contents (option_menu);}static voidgtk_option_menu_update_contents (GtkOptionMenu *option_menu){ GtkWidget *child; GtkRequisition child_requisition; g_return_if_fail (option_menu != NULL); g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); if (option_menu->menu) { gtk_option_menu_remove_contents (option_menu); option_menu->menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu)); if (option_menu->menu_item) { gtk_widget_ref (option_menu->menu_item); child = GTK_BIN (option_menu->menu_item)->child; if (child) { if (GTK_BIN (option_menu)->child) gtk_container_remove (GTK_CONTAINER (option_menu), GTK_BIN (option_menu)->child); if (GTK_WIDGET (option_menu)->state != child->state) gtk_widget_set_state (child, GTK_WIDGET (option_menu)->state); gtk_widget_reparent (child, GTK_WIDGET (option_menu)); } gtk_widget_size_request (child, &child_requisition); gtk_widget_size_allocate (GTK_WIDGET (option_menu), &(GTK_WIDGET (option_menu)->allocation)); if (GTK_WIDGET_DRAWABLE (option_menu)) gtk_widget_queue_draw (GTK_WIDGET (option_menu)); } }}static voidgtk_option_menu_remove_contents (GtkOptionMenu *option_menu){ g_return_if_fail (option_menu != NULL); g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); if (GTK_BIN (option_menu)->child) { if (GTK_WIDGET (option_menu->menu_item)->state != GTK_BIN (option_menu)->child->state) gtk_widget_set_state (GTK_BIN (option_menu)->child, GTK_WIDGET (option_menu->menu_item)->state); gtk_widget_reparent (GTK_BIN (option_menu)->child, option_menu->menu_item); gtk_widget_unref (option_menu->menu_item); option_menu->menu_item = NULL; }}static voidgtk_option_menu_calc_size (GtkOptionMenu *option_menu){ GtkWidget *child; GList *children; GtkRequisition child_requisition; g_return_if_fail (option_menu != NULL); g_return_if_fail (GTK_IS_OPTION_MENU (option_menu)); option_menu->width = 0; option_menu->height = 0; if (option_menu->menu) { children = GTK_MENU_SHELL (option_menu->menu)->children; while (children) { child = children->data; children = children->next; if (GTK_WIDGET_VISIBLE (child)) { gtk_widget_size_request (child, &child_requisition); option_menu->width = MAX (option_menu->width, child_requisition.width); option_menu->height = MAX (option_menu->height, child_requisition.height); } } }}static voidgtk_option_menu_position (GtkMenu *menu, gint *x, gint *y, gpointer user_data){ GtkOptionMenu *option_menu; GtkWidget *active; GtkWidget *child; GList *children; gint shift_menu; gint screen_width; gint screen_height; gint menu_xpos; gint menu_ypos; gint width; gint height; g_return_if_fail (user_data != NULL); g_return_if_fail (GTK_IS_OPTION_MENU (user_data)); option_menu = GTK_OPTION_MENU (user_data); width = GTK_WIDGET (menu)->allocation.width; height = GTK_WIDGET (menu)->allocation.height; active = gtk_menu_get_active (GTK_MENU (option_menu->menu)); children = GTK_MENU_SHELL (option_menu->menu)->children; gdk_window_get_origin (GTK_WIDGET (option_menu)->window, &menu_xpos, &menu_ypos); menu_ypos += GTK_WIDGET (option_menu)->allocation.height / 2 - 2; if (active != NULL) menu_ypos -= active->requisition.height / 2; while (children) { child = children->data; if (active == child) break; if (GTK_WIDGET_VISIBLE (child)) menu_ypos -= child->allocation.height; children = children->next; } screen_width = gdk_screen_width (); screen_height = gdk_screen_height (); shift_menu = FALSE; if (menu_ypos < 0) { menu_ypos = 0; shift_menu = TRUE; } else if ((menu_ypos + height) > screen_height) { menu_ypos -= ((menu_ypos + height) - screen_height); shift_menu = TRUE; } if (shift_menu) { if ((menu_xpos + GTK_WIDGET (option_menu)->allocation.width + width) <= screen_width) menu_xpos += GTK_WIDGET (option_menu)->allocation.width; else menu_xpos -= width; } if (menu_xpos < 0) menu_xpos = 0; else if ((menu_xpos + width) > screen_width) menu_xpos -= ((menu_xpos + width) - screen_width); *x = menu_xpos; *y = menu_ypos;}static voidgtk_option_menu_show_all (GtkWidget *widget){ GtkContainer *container; GtkOptionMenu *option_menu; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_OPTION_MENU (widget)); container = GTK_CONTAINER (widget); option_menu = GTK_OPTION_MENU (widget); gtk_widget_show (widget); gtk_container_foreach (container, (GtkCallback) gtk_widget_show_all, NULL); if (option_menu->menu) gtk_widget_show_all (option_menu->menu); if (option_menu->menu_item) gtk_widget_show_all (option_menu->menu_item);}static voidgtk_option_menu_hide_all (GtkWidget *widget){ GtkContainer *container; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_OPTION_MENU (widget)); container = GTK_CONTAINER (widget); gtk_widget_hide (widget); gtk_container_foreach (container, (GtkCallback) gtk_widget_hide_all, NULL);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -