⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtk2drawing.c

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 C
📖 第 1 页 / 共 5 页
字号:
}/* 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 + -