📄 gtkwidget.c
字号:
break; case ARG_COMPOSITE_CHILD: GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_COMPOSITE_CHILD (widget) != FALSE); break; case ARG_STYLE: GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget); break; case ARG_EVENTS: eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id); if (!eventp) GTK_VALUE_FLAGS (*arg) = 0; else GTK_VALUE_FLAGS (*arg) = *eventp; break; case ARG_EXTENSION_EVENTS: modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id); if (!modep) GTK_VALUE_FLAGS (*arg) = 0; else GTK_VALUE_FLAGS (*arg) = *modep; break; default: arg->type = GTK_TYPE_INVALID; break; }}/***************************************** * gtk_widget_init: * * arguments: * * results: *****************************************/static voidgtk_widget_init (GtkWidget *widget){ GdkColormap *colormap; GdkVisual *visual; GTK_PRIVATE_FLAGS (widget) = 0; widget->state = GTK_STATE_NORMAL; widget->saved_state = GTK_STATE_NORMAL; widget->name = NULL; widget->requisition.width = 0; widget->requisition.height = 0; widget->allocation.x = -1; widget->allocation.y = -1; widget->allocation.width = 1; widget->allocation.height = 1; widget->window = NULL; widget->parent = NULL; GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE | GTK_PARENT_SENSITIVE | (composite_child_stack ? GTK_COMPOSITE_CHILD : 0)); widget->style = gtk_widget_peek_style (); gtk_style_ref (widget->style); colormap = gtk_widget_peek_colormap (); visual = gtk_widget_peek_visual (); if (colormap != gtk_widget_get_default_colormap ()) gtk_widget_set_colormap (widget, colormap); if (visual != gtk_widget_get_default_visual ()) gtk_widget_set_visual (widget, visual);}/***************************************** * gtk_widget_new: * * arguments: * * results: *****************************************/GtkWidget*gtk_widget_new (GtkType widget_type, const gchar *first_arg_name, ...){ GtkObject *object; va_list var_args; GSList *arg_list = NULL; GSList *info_list = NULL; gchar *error; g_return_val_if_fail (gtk_type_is_a (widget_type, GTK_TYPE_WIDGET), NULL); object = gtk_type_new (widget_type); va_start (var_args, first_arg_name); error = gtk_object_args_collect (GTK_OBJECT_TYPE (object), &arg_list, &info_list, first_arg_name, var_args); va_end (var_args); if (error) { g_warning ("gtk_widget_new(): %s", error); g_free (error); } else { GSList *slist_arg; GSList *slist_info; slist_arg = arg_list; slist_info = info_list; while (slist_arg) { gtk_object_arg_set (object, slist_arg->data, slist_info->data); slist_arg = slist_arg->next; slist_info = slist_info->next; } gtk_args_collect_cleanup (arg_list, info_list); } if (!GTK_OBJECT_CONSTRUCTED (object)) gtk_object_default_construct (object); return GTK_WIDGET (object);}/***************************************** * gtk_widget_newv: * * arguments: * * results: *****************************************/GtkWidget*gtk_widget_newv (GtkType type, guint nargs, GtkArg *args){ g_return_val_if_fail (gtk_type_is_a (type, GTK_TYPE_WIDGET), NULL); return GTK_WIDGET (gtk_object_newv (type, nargs, args));}/***************************************** * gtk_widget_get: * * arguments: * * results: *****************************************/voidgtk_widget_get (GtkWidget *widget, GtkArg *arg){ g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (arg != NULL); gtk_object_getv (GTK_OBJECT (widget), 1, arg);}/***************************************** * gtk_widget_getv: * * arguments: * * results: *****************************************/voidgtk_widget_getv (GtkWidget *widget, guint nargs, GtkArg *args){ g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WIDGET (widget)); gtk_object_getv (GTK_OBJECT (widget), nargs, args);}/***************************************** * gtk_widget_set: * * arguments: * * results: *****************************************/voidgtk_widget_set (GtkWidget *widget, const gchar *first_arg_name, ...){ GtkObject *object; va_list var_args; GSList *arg_list = NULL; GSList *info_list = NULL; gchar *error; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WIDGET (widget)); object = GTK_OBJECT (widget); va_start (var_args, first_arg_name); error = gtk_object_args_collect (GTK_OBJECT_TYPE (object), &arg_list, &info_list, first_arg_name, var_args); va_end (var_args); if (error) { g_warning ("gtk_widget_set(): %s", error); g_free (error); } else { GSList *slist_arg; GSList *slist_info; slist_arg = arg_list; slist_info = info_list; while (slist_arg) { gtk_object_arg_set (object, slist_arg->data, slist_info->data); slist_arg = slist_arg->next; slist_info = slist_info->next; } gtk_args_collect_cleanup (arg_list, info_list); }}/***************************************** * gtk_widget_setv: * * arguments: * * results: *****************************************/voidgtk_widget_setv (GtkWidget *widget, guint nargs, GtkArg *args){ g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WIDGET (widget)); gtk_object_setv (GTK_OBJECT (widget), nargs, args);}static inline void gtk_widget_queue_clear_child (GtkWidget *widget){ GtkWidget *parent; /* We check for GTK_WIDGET_IS_OFFSCREEN (widget), * and queue_clear_area(parent...) will check the rest of * way up the tree with gtk_widget_is_offscreen (parent) */ parent = widget->parent; if (parent && GTK_WIDGET_DRAWABLE (parent) && !GTK_WIDGET_IS_OFFSCREEN (widget)) gtk_widget_queue_clear_area (parent, widget->allocation.x, widget->allocation.y, widget->allocation.width, widget->allocation.height);}voidgtk_widget_unparent (GtkWidget *widget){ GtkWidget *toplevel; GtkWidget *old_parent; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WIDGET (widget)); if (widget->parent == NULL) return; /* keep this function in sync with gtk_menu_detach() */ /* unset focused and default children properly, this code * should eventually move into some gtk_window_unparent_branch() or * similar function. */ toplevel = gtk_widget_get_toplevel (widget); if (GTK_CONTAINER (widget->parent)->focus_child == widget) { gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL); if (GTK_IS_WINDOW (toplevel)) { GtkWidget *child; child = GTK_WINDOW (toplevel)->focus_widget; while (child && child != widget) child = child->parent; if (child == widget) gtk_window_set_focus (GTK_WINDOW (toplevel), NULL); } } if (GTK_IS_WINDOW (toplevel)) { GtkWidget *child; child = GTK_WINDOW (toplevel)->default_widget; while (child && child != widget) child = child->parent; if (child == widget) gtk_window_set_default (GTK_WINDOW (toplevel), NULL); } if (GTK_WIDGET_REDRAW_PENDING (widget)) gtk_widget_redraw_queue_remove (widget); if (GTK_IS_RESIZE_CONTAINER (widget)) gtk_container_clear_resize_widgets (GTK_CONTAINER (widget)); /* Remove the widget and all its children from any ->resize_widgets list * of all the parents in our branch. This code should move into gtkcontainer.c * somwhen, since we mess around with ->resize_widgets, which is * actually not of our business. * * Two ways to make this prettier: * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer)) * Change resize_widgets to a GList */ toplevel = widget->parent; while (toplevel) { GSList *slist; GSList *prev; if (!GTK_CONTAINER (toplevel)->resize_widgets) { toplevel = toplevel->parent; continue; } prev = NULL; slist = GTK_CONTAINER (toplevel)->resize_widgets; while (slist) { GtkWidget *child; GtkWidget *parent; GSList *last; last = slist; slist = last->next; child = last->data; parent = child; while (parent && (parent != widget)) parent = parent->parent; if (parent == widget) { GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED); if (prev) prev->next = slist; else GTK_CONTAINER (toplevel)->resize_widgets = slist; g_slist_free_1 (last); } else prev = last; } toplevel = toplevel->parent; } gtk_widget_queue_clear_child (widget); /* Reset the width and height here, to force reallocation if we * get added back to a new parent. This won't work if our new * allocation is smaller than 1x1 and we actually want a size of 1x1... * (would 0x0 be OK here?) */ widget->allocation.width = 1; widget->allocation.height = 1; if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget)) gtk_widget_unrealize (widget); old_parent = widget->parent; widget->parent = NULL; gtk_widget_set_parent_window (widget, NULL); gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent); gtk_widget_unref (widget);}/***************************************** * gtk_widget_destroy: * * arguments: * * results: *****************************************/voidgtk_widget_destroy (GtkWidget *widget){ g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (GTK_OBJECT_CONSTRUCTED (widget)); gtk_object_destroy ((GtkObject*) widget);}/***************************************** * gtk_widget_destroyed: * Utility function: sets widget_pointer * to NULL when widget is destroyed. * * arguments: * * results: *****************************************/voidgtk_widget_destroyed (GtkWidget *widget, GtkWidget **widget_pointer){ /* Don't make any assumptions about the * value of widget! * Even check widget_pointer. */ if (widget_pointer) *widget_pointer = NULL;}/***************************************** * gtk_widget_show: * * arguments: * * results: *****************************************/voidgtk_widget_show (GtkWidget *widget){ g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WIDGET (widget)); if (!GTK_WIDGET_VISIBLE (widget)) { if (!GTK_WIDGET_TOPLEVEL (widget)) gtk_widget_queue_resize (widget); gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]); }}static voidgtk_widget_real_show (GtkWidget *widget){ g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_WIDGET (widget)); if (!GTK_WIDGET_VISIBLE (widget)) { GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -