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

📄 gtkcols.c

📁 大名鼎鼎的远程登录软件putty的Symbian版源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * gtkcols.c - implementation of the `Columns' GTK layout container. */#include "gtkcols.h"static void columns_init(Columns *cols);static void columns_class_init(ColumnsClass *klass);static void columns_map(GtkWidget *widget);static void columns_unmap(GtkWidget *widget);static void columns_draw(GtkWidget *widget, GdkRectangle *area);static gint columns_expose(GtkWidget *widget, GdkEventExpose *event);static void columns_base_add(GtkContainer *container, GtkWidget *widget);static void columns_remove(GtkContainer *container, GtkWidget *widget);static void columns_forall(GtkContainer *container, gboolean include_internals,                           GtkCallback callback, gpointer callback_data);static gint columns_focus(GtkContainer *container, GtkDirectionType dir);static GtkType columns_child_type(GtkContainer *container);static void columns_size_request(GtkWidget *widget, GtkRequisition *req);static void columns_size_allocate(GtkWidget *widget, GtkAllocation *alloc);static GtkContainerClass *parent_class = NULL;GtkType columns_get_type(void){    static GtkType columns_type = 0;    if (!columns_type) {        static const GtkTypeInfo columns_info = {            "Columns",            sizeof(Columns),            sizeof(ColumnsClass),            (GtkClassInitFunc) columns_class_init,            (GtkObjectInitFunc) columns_init,            /* reserved_1 */ NULL,            /* reserved_2 */ NULL,            (GtkClassInitFunc) NULL,        };        columns_type = gtk_type_unique(GTK_TYPE_CONTAINER, &columns_info);    }    return columns_type;}static gint (*columns_inherited_focus)(GtkContainer *container,				       GtkDirectionType direction);static void columns_class_init(ColumnsClass *klass){    GtkObjectClass *object_class;    GtkWidgetClass *widget_class;    GtkContainerClass *container_class;    object_class = (GtkObjectClass *)klass;    widget_class = (GtkWidgetClass *)klass;    container_class = (GtkContainerClass *)klass;    parent_class = gtk_type_class(GTK_TYPE_CONTAINER);    /*     * FIXME: do we have to do all this faffing with set_arg,     * get_arg and child_arg_type? Ick.     */    widget_class->map = columns_map;    widget_class->unmap = columns_unmap;    widget_class->draw = columns_draw;    widget_class->expose_event = columns_expose;    widget_class->size_request = columns_size_request;    widget_class->size_allocate = columns_size_allocate;    container_class->add = columns_base_add;    container_class->remove = columns_remove;    container_class->forall = columns_forall;    container_class->child_type = columns_child_type;    /* Save the previous value of this method. */    if (!columns_inherited_focus)	columns_inherited_focus = container_class->focus;    container_class->focus = columns_focus;}static void columns_init(Columns *cols){    GTK_WIDGET_SET_FLAGS(cols, GTK_NO_WINDOW);    cols->children = NULL;    cols->spacing = 0;}/* * These appear to be thoroughly tedious functions; the only reason * we have to reimplement them at all is because we defined our own * format for our GList of children... */static void columns_map(GtkWidget *widget){    Columns *cols;    ColumnsChild *child;    GList *children;    g_return_if_fail(widget != NULL);    g_return_if_fail(IS_COLUMNS(widget));    cols = COLUMNS(widget);    GTK_WIDGET_SET_FLAGS(cols, GTK_MAPPED);    for (children = cols->children;         children && (child = children->data);         children = children->next) {        if (child->widget &&	    GTK_WIDGET_VISIBLE(child->widget) &&            !GTK_WIDGET_MAPPED(child->widget))            gtk_widget_map(child->widget);    }}static void columns_unmap(GtkWidget *widget){    Columns *cols;    ColumnsChild *child;    GList *children;    g_return_if_fail(widget != NULL);    g_return_if_fail(IS_COLUMNS(widget));    cols = COLUMNS(widget);    GTK_WIDGET_UNSET_FLAGS(cols, GTK_MAPPED);    for (children = cols->children;         children && (child = children->data);         children = children->next) {        if (child->widget &&	    GTK_WIDGET_VISIBLE(child->widget) &&            GTK_WIDGET_MAPPED(child->widget))            gtk_widget_unmap(child->widget);    }}static void columns_draw(GtkWidget *widget, GdkRectangle *area){    Columns *cols;    ColumnsChild *child;    GList *children;    GdkRectangle child_area;    g_return_if_fail(widget != NULL);    g_return_if_fail(IS_COLUMNS(widget));    if (GTK_WIDGET_DRAWABLE(widget)) {        cols = COLUMNS(widget);        for (children = cols->children;             children && (child = children->data);             children = children->next) {            if (child->widget &&		GTK_WIDGET_DRAWABLE(child->widget) &&                gtk_widget_intersect(child->widget, area, &child_area))                gtk_widget_draw(child->widget, &child_area);        }    }}static gint columns_expose(GtkWidget *widget, GdkEventExpose *event){    Columns *cols;    ColumnsChild *child;    GList *children;    GdkEventExpose child_event;    g_return_val_if_fail(widget != NULL, FALSE);    g_return_val_if_fail(IS_COLUMNS(widget), FALSE);    g_return_val_if_fail(event != NULL, FALSE);    if (GTK_WIDGET_DRAWABLE(widget)) {        cols = COLUMNS(widget);        child_event = *event;        for (children = cols->children;             children && (child = children->data);             children = children->next) {            if (child->widget &&		GTK_WIDGET_DRAWABLE(child->widget) &&                GTK_WIDGET_NO_WINDOW(child->widget) &&                gtk_widget_intersect(child->widget, &event->area,                                     &child_event.area))                gtk_widget_event(child->widget, (GdkEvent *)&child_event);        }    }    return FALSE;}static void columns_base_add(GtkContainer *container, GtkWidget *widget){    Columns *cols;    g_return_if_fail(container != NULL);    g_return_if_fail(IS_COLUMNS(container));    g_return_if_fail(widget != NULL);    cols = COLUMNS(container);    /*     * Default is to add a new widget spanning all columns.     */    columns_add(cols, widget, 0, 0);   /* 0 means ncols */}static void columns_remove(GtkContainer *container, GtkWidget *widget){    Columns *cols;    ColumnsChild *child;    GtkWidget *childw;    GList *children;    gboolean was_visible;    g_return_if_fail(container != NULL);    g_return_if_fail(IS_COLUMNS(container));    g_return_if_fail(widget != NULL);    cols = COLUMNS(container);    for (children = cols->children;         children && (child = children->data);         children = children->next) {        if (child->widget != widget)            continue;        was_visible = GTK_WIDGET_VISIBLE(widget);        gtk_widget_unparent(widget);        cols->children = g_list_remove_link(cols->children, children);        g_list_free(children);        g_free(child);        if (was_visible)            gtk_widget_queue_resize(GTK_WIDGET(container));        break;    }    for (children = cols->taborder;         children && (childw = children->data);         children = children->next) {        if (childw != widget)            continue;        cols->taborder = g_list_remove_link(cols->taborder, children);        g_list_free(children);        break;    }}static void columns_forall(GtkContainer *container, gboolean include_internals,                           GtkCallback callback, gpointer callback_data){    Columns *cols;    ColumnsChild *child;    GList *children, *next;    g_return_if_fail(container != NULL);    g_return_if_fail(IS_COLUMNS(container));    g_return_if_fail(callback != NULL);    cols = COLUMNS(container);    for (children = cols->children;         children && (child = children->data);         children = next) {        /*         * We can't wait until after the callback to assign         * `children = children->next', because the callback might         * be gtk_widget_destroy, which would remove the link         * `children' from the list! So instead we must get our         * hands on the value of the `next' pointer _before_ the         * callback.         */        next = children->next;	if (child->widget)	    callback(child->widget, callback_data);    }}static GtkType columns_child_type(GtkContainer *container){    return GTK_TYPE_WIDGET;}GtkWidget *columns_new(gint spacing){    Columns *cols;    cols = gtk_type_new(columns_get_type());    cols->spacing = spacing;    return GTK_WIDGET(cols);}void columns_set_cols(Columns *cols, gint ncols, const gint *percentages){    ColumnsChild *childdata;    gint i;    g_return_if_fail(cols != NULL);    g_return_if_fail(IS_COLUMNS(cols));    g_return_if_fail(ncols > 0);    g_return_if_fail(percentages != NULL);    childdata = g_new(ColumnsChild, 1);    childdata->widget = NULL;    childdata->ncols = ncols;    childdata->percentages = g_new(gint, ncols);    childdata->force_left = FALSE;    for (i = 0; i < ncols; i++)        childdata->percentages[i] = percentages[i];    cols->children = g_list_append(cols->children, childdata);}void columns_add(Columns *cols, GtkWidget *child,                 gint colstart, gint colspan){    ColumnsChild *childdata;    g_return_if_fail(cols != NULL);    g_return_if_fail(IS_COLUMNS(cols));    g_return_if_fail(child != NULL);    g_return_if_fail(child->parent == NULL);    childdata = g_new(ColumnsChild, 1);    childdata->widget = child;    childdata->colstart = colstart;    childdata->colspan = colspan;    childdata->force_left = FALSE;    cols->children = g_list_append(cols->children, childdata);    cols->taborder = g_list_append(cols->taborder, child);    gtk_widget_set_parent(child, GTK_WIDGET(cols));    if (GTK_WIDGET_REALIZED(cols))        gtk_widget_realize(child);    if (GTK_WIDGET_VISIBLE(cols) && GTK_WIDGET_VISIBLE(child)) {        if (GTK_WIDGET_MAPPED(cols))            gtk_widget_map(child);        gtk_widget_queue_resize(child);    }}void columns_force_left_align(Columns *cols, GtkWidget *widget){    ColumnsChild *child;    GList *children;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -