📄 gtk2drawing.c
字号:
}/* We need to have pointers to the inner widgets (entry, button, arrow) of * the ComboBoxEntry to get the correct rendering from theme engines which * special cases their look. Since the inner layout can change, we ask GTK * to NULL our pointers when they are about to become invalid because the * corresponding widgets don't exist anymore. It's the role of * g_object_add_weak_pointer(). * Note that if we don't find the inner widgets (which shouldn't happen), we * fallback to use generic "non-inner" widgets, and they don't need that kind * of weak pointer since they are explicit children of gProtoWindow and as * such GTK holds a strong reference to them. */static voidmoz_gtk_get_combo_box_entry_inner_widgets(GtkWidget *widget, gpointer client_data){ if (GTK_IS_TOGGLE_BUTTON(widget)) { gComboBoxEntryButtonWidget = widget; g_object_add_weak_pointer(G_OBJECT(widget), (gpointer) &gComboBoxEntryButtonWidget); } else if (GTK_IS_ENTRY(widget)) { gComboBoxEntryTextareaWidget = widget; g_object_add_weak_pointer(G_OBJECT(widget), (gpointer) &gComboBoxEntryTextareaWidget); } else return; gtk_widget_realize(widget); g_object_set_data(G_OBJECT(widget), "transparent-bg-hint", GINT_TO_POINTER(TRUE));}static voidmoz_gtk_get_combo_box_entry_arrow(GtkWidget *widget, gpointer client_data){ if (GTK_IS_ARROW(widget)) { gComboBoxEntryArrowWidget = widget; g_object_add_weak_pointer(G_OBJECT(widget), (gpointer) &gComboBoxEntryArrowWidget); gtk_widget_realize(widget); g_object_set_data(G_OBJECT(widget), "transparent-bg-hint", GINT_TO_POINTER(TRUE)); }}static gintensure_combo_box_entry_widgets(){ GtkWidget* buttonChild; if (gComboBoxEntryTextareaWidget && gComboBoxEntryButtonWidget && gComboBoxEntryArrowWidget) return MOZ_GTK_SUCCESS; /* Create a ComboBoxEntry if needed */ if (!gComboBoxEntryWidget) { gComboBoxEntryWidget = gtk_combo_box_entry_new(); setup_widget_prototype(gComboBoxEntryWidget); } /* Get its inner Entry and Button */ gtk_container_forall(GTK_CONTAINER(gComboBoxEntryWidget), moz_gtk_get_combo_box_entry_inner_widgets, NULL); if (!gComboBoxEntryTextareaWidget) { ensure_entry_widget(); gComboBoxEntryTextareaWidget = gEntryWidget; } if (gComboBoxEntryButtonWidget) { /* Get the Arrow inside the Button */ buttonChild = GTK_BIN(gComboBoxEntryButtonWidget)->child; if (GTK_IS_HBOX(buttonChild)) { /* appears-as-list = FALSE, cell-view = TRUE; the button * contains an hbox. This hbox is there because ComboBoxEntry * inherits from ComboBox which needs to place a cell renderer, * a separator, and an arrow in the button when appears-as-list * is FALSE. Here the hbox should only contain an arrow, since * a ComboBoxEntry doesn't need all those widgets in the * button. */ gtk_container_forall(GTK_CONTAINER(buttonChild), moz_gtk_get_combo_box_entry_arrow, NULL); } else if(GTK_IS_ARROW(buttonChild)) { /* appears-as-list = TRUE, or cell-view = FALSE; * the button only contains an arrow */ gComboBoxEntryArrowWidget = buttonChild; g_object_add_weak_pointer(G_OBJECT(buttonChild), (gpointer) &gComboBoxEntryArrowWidget); gtk_widget_realize(gComboBoxEntryArrowWidget); g_object_set_data(G_OBJECT(gComboBoxEntryArrowWidget), "transparent-bg-hint", GINT_TO_POINTER(TRUE)); } } else { /* Shouldn't be reached with current internal gtk implementation; * we use a generic toggle button as last resort fallback to avoid * crashing. */ ensure_toggle_button_widget(); gComboBoxEntryButtonWidget = gToggleButtonWidget; } if (!gComboBoxEntryArrowWidget) { /* Shouldn't be reached with current internal gtk implementation; * we gButtonArrowWidget as last resort fallback to avoid * crashing. */ ensure_button_arrow_widget(); gComboBoxEntryArrowWidget = gButtonArrowWidget; } return MOZ_GTK_SUCCESS;}static gintensure_handlebox_widget(){ if (!gHandleBoxWidget) { gHandleBoxWidget = gtk_handle_box_new(); setup_widget_prototype(gHandleBoxWidget); } return MOZ_GTK_SUCCESS;}static gintensure_toolbar_widget(){ if (!gToolbarWidget) { ensure_handlebox_widget(); gToolbarWidget = gtk_toolbar_new(); gtk_container_add(GTK_CONTAINER(gHandleBoxWidget), gToolbarWidget); gtk_widget_realize(gToolbarWidget); g_object_set_data(G_OBJECT(gToolbarWidget), "transparent-bg-hint", GINT_TO_POINTER(TRUE)); } return MOZ_GTK_SUCCESS;}static gintensure_toolbar_separator_widget(){ if (!gToolbarSeparatorWidget) { ensure_toolbar_widget(); gToolbarSeparatorWidget = GTK_WIDGET(gtk_separator_tool_item_new()); setup_widget_prototype(gToolbarSeparatorWidget); } return MOZ_GTK_SUCCESS;}static gintensure_tooltip_widget(){ if (!gTooltipWidget) { gTooltipWidget = gtk_window_new(GTK_WINDOW_POPUP); gtk_widget_realize(gTooltipWidget); moz_gtk_set_widget_name(gTooltipWidget); } return MOZ_GTK_SUCCESS;}static gintensure_tab_widget(){ if (!gTabWidget) { gTabWidget = gtk_notebook_new(); setup_widget_prototype(gTabWidget); } return MOZ_GTK_SUCCESS;}static gintensure_progress_widget(){ if (!gProgressWidget) { gProgressWidget = gtk_progress_bar_new(); setup_widget_prototype(gProgressWidget); } return MOZ_GTK_SUCCESS;}static gintensure_statusbar_widget(){ if (!gStatusbarWidget) { gStatusbarWidget = gtk_statusbar_new(); setup_widget_prototype(gStatusbarWidget); } return MOZ_GTK_SUCCESS;}static gintensure_frame_widget(){ if (!gFrameWidget) { ensure_statusbar_widget(); gFrameWidget = gtk_frame_new(NULL); gtk_container_add(GTK_CONTAINER(gStatusbarWidget), gFrameWidget); gtk_widget_realize(gFrameWidget); } return MOZ_GTK_SUCCESS;}static gintensure_menu_bar_widget(){ if (!gMenuBarWidget) { gMenuBarWidget = gtk_menu_bar_new(); setup_widget_prototype(gMenuBarWidget); } return MOZ_GTK_SUCCESS;}static gintensure_menu_bar_item_widget(){ if (!gMenuBarItemWidget) { ensure_menu_bar_widget(); gMenuBarItemWidget = gtk_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(gMenuBarWidget), gMenuBarItemWidget); gtk_widget_realize(gMenuBarItemWidget); g_object_set_data(G_OBJECT(gMenuBarItemWidget), "transparent-bg-hint", GINT_TO_POINTER(TRUE)); } return MOZ_GTK_SUCCESS;}static gintensure_menu_popup_widget(){ if (!gMenuPopupWidget) { ensure_menu_bar_item_widget(); gMenuPopupWidget = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(gMenuBarItemWidget), gMenuPopupWidget); gtk_widget_realize(gMenuPopupWidget); g_object_set_data(G_OBJECT(gMenuPopupWidget), "transparent-bg-hint", GINT_TO_POINTER(TRUE)); } return MOZ_GTK_SUCCESS;}static gintensure_menu_item_widget(){ if (!gMenuItemWidget) { ensure_menu_popup_widget(); gMenuItemWidget = gtk_menu_item_new_with_label("M"); gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), gMenuItemWidget); gtk_widget_realize(gMenuItemWidget); g_object_set_data(G_OBJECT(gMenuItemWidget), "transparent-bg-hint", GINT_TO_POINTER(TRUE)); } return MOZ_GTK_SUCCESS;}static gintensure_image_menu_item_widget(){ if (!gImageMenuItemWidget) { ensure_menu_popup_widget(); gImageMenuItemWidget = gtk_image_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), gImageMenuItemWidget); gtk_widget_realize(gImageMenuItemWidget); g_object_set_data(G_OBJECT(gImageMenuItemWidget), "transparent-bg-hint", GINT_TO_POINTER(TRUE)); } return MOZ_GTK_SUCCESS;}static gintensure_menu_separator_widget(){ if (!gMenuSeparatorWidget) { ensure_menu_popup_widget(); gMenuSeparatorWidget = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), gMenuSeparatorWidget); gtk_widget_realize(gMenuSeparatorWidget); g_object_set_data(G_OBJECT(gMenuSeparatorWidget), "transparent-bg-hint", GINT_TO_POINTER(TRUE)); } return MOZ_GTK_SUCCESS;}static gintensure_check_menu_item_widget(){ if (!gCheckMenuItemWidget) { ensure_menu_popup_widget(); gCheckMenuItemWidget = gtk_check_menu_item_new_with_label("M"); gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), gCheckMenuItemWidget); gtk_widget_realize(gCheckMenuItemWidget); g_object_set_data(G_OBJECT(gCheckMenuItemWidget), "transparent-bg-hint", GINT_TO_POINTER(TRUE)); } return MOZ_GTK_SUCCESS;}static gintensure_tree_view_widget(){ if (!gTreeViewWidget) { gTreeViewWidget = gtk_tree_view_new(); setup_widget_prototype(gTreeViewWidget); } return MOZ_GTK_SUCCESS;}static gintensure_tree_header_cell_widget(){ if(!gTreeHeaderCellWidget) { /* * Some GTK engines paint the first and last cell * of a TreeView header with a highlight. * Since we do not know where our widget will be relative * to the other buttons in the TreeView header, we must * paint it as a button that is between two others, * thus ensuring it is neither the first or last button * in the header. * GTK doesn't give us a way to do this explicitly, * so we must paint with a button that is between two * others. */ GtkTreeViewColumn* firstTreeViewColumn; GtkTreeViewColumn* lastTreeViewColumn; ensure_tree_view_widget(); /* Create and append our three columns */ firstTreeViewColumn = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(firstTreeViewColumn, "M"); gtk_tree_view_append_column(GTK_TREE_VIEW(gTreeViewWidget), firstTreeViewColumn); gMiddleTreeViewColumn = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(gMiddleTreeViewColumn), "M"); gtk_tree_view_append_column(GTK_TREE_VIEW(gTreeViewWidget), GTK_TREE_VIEW_COLUMN(gMiddleTreeViewColumn)); lastTreeViewColumn = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(lastTreeViewColumn, "M"); gtk_tree_view_append_column(GTK_TREE_VIEW(gTreeViewWidget), lastTreeViewColumn); /* Use the middle column's header for our button */ gTreeHeaderCellWidget = GTK_TREE_VIEW_COLUMN(gMiddleTreeViewColumn)->button; gTreeHeaderSortArrowWidget = GTK_TREE_VIEW_COLUMN(gMiddleTreeViewColumn)->arrow; g_object_set_data(G_OBJECT(gTreeHeaderCellWidget), "transparent-bg-hint", GINT_TO_POINTER(TRUE)); g_object_set_data(G_OBJECT(gTreeHeaderSortArrowWidget), "transparent-bg-hint", GINT_TO_POINTER(TRUE)); } return MOZ_GTK_SUCCESS;}static gintensure_expander_widget(){ if (!gExpanderWidget) { gExpanderWidget = gtk_expander_new("M"); setup_widget_prototype(gExpanderWidget); } return MOZ_GTK_SUCCESS;}static gintensure_scrolled_window_widget(){ if (!gScrolledWindowWidget) { gScrolledWindowWidget = gtk_scrolled_window_new(NULL, NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -