📄 gtklayout.c
字号:
container_class->forall = gtk_layout_forall; class->set_scroll_adjustments = gtk_layout_set_adjustments; widget_class->set_scroll_adjustments_signal = gtk_signal_new ("set_scroll_adjustments", GTK_RUN_LAST, object_class->type, GTK_SIGNAL_OFFSET (GtkLayoutClass, set_scroll_adjustments), gtk_marshal_NONE__POINTER_POINTER, GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);}static voidgtk_layout_init (GtkLayout *layout){ layout->children = NULL; layout->width = 100; layout->height = 100; layout->hadjustment = NULL; layout->vadjustment = NULL; layout->bin_window = NULL; layout->configure_serial = 0; layout->scroll_x = 0; layout->scroll_y = 0; layout->visibility = GDK_VISIBILITY_PARTIAL; layout->freeze_count = 0;}/* Widget methods */static void gtk_layout_realize (GtkWidget *widget){ GList *tmp_list; GtkLayout *layout; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_LAYOUT (widget)); layout = GTK_LAYOUT (widget); GTK_WIDGET_SET_FLAGS (layout, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gdk_window_set_user_data (widget->window, widget); attributes.x = 0; attributes.y = 0; attributes.event_mask = GDK_EXPOSURE_MASK | gtk_widget_get_events (widget); layout->bin_window = gdk_window_new (widget->window, &attributes, attributes_mask); gdk_window_set_user_data (layout->bin_window, widget); widget->style = gtk_style_attach (widget->style, widget->window); gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); gtk_style_set_background (widget->style, layout->bin_window, GTK_STATE_NORMAL); gdk_window_add_filter (widget->window, gtk_layout_main_filter, layout); gdk_window_add_filter (layout->bin_window, gtk_layout_filter, layout); /* XXX: If we ever get multiple displays for GTK+, then gravity_works * will have to become a widget member. Right now we just * keep it as a global */ gravity_works = gdk_window_set_static_gravities (layout->bin_window, TRUE); tmp_list = layout->children; while (tmp_list) { GtkLayoutChild *child = tmp_list->data; tmp_list = tmp_list->next; gtk_widget_set_parent_window (child->widget, layout->bin_window); }}static void gtk_layout_map (GtkWidget *widget){ GList *tmp_list; GtkLayout *layout; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_LAYOUT (widget)); layout = GTK_LAYOUT (widget); GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED); tmp_list = layout->children; while (tmp_list) { GtkLayoutChild *child = tmp_list->data; tmp_list = tmp_list->next; if (GTK_WIDGET_VISIBLE (child->widget)) { if (!GTK_WIDGET_MAPPED (child->widget) && !GTK_WIDGET_IS_OFFSCREEN (child->widget)) gtk_widget_map (child->widget); } } gdk_window_show (layout->bin_window); gdk_window_show (widget->window);}static void gtk_layout_unrealize (GtkWidget *widget){ GtkLayout *layout; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_LAYOUT (widget)); layout = GTK_LAYOUT (widget); gdk_window_set_user_data (layout->bin_window, NULL); gdk_window_destroy (layout->bin_window); layout->bin_window = NULL; if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);}static void gtk_layout_size_request (GtkWidget *widget, GtkRequisition *requisition){ GList *tmp_list; GtkLayout *layout; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_LAYOUT (widget)); layout = GTK_LAYOUT (widget); requisition->width = 0; requisition->height = 0; tmp_list = layout->children; while (tmp_list) { GtkLayoutChild *child = tmp_list->data; GtkRequisition child_requisition; tmp_list = tmp_list->next; gtk_widget_size_request (child->widget, &child_requisition); }}static void gtk_layout_size_allocate (GtkWidget *widget, GtkAllocation *allocation){ GList *tmp_list; GtkLayout *layout; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_LAYOUT (widget)); widget->allocation = *allocation; layout = GTK_LAYOUT (widget); tmp_list = layout->children; while (tmp_list) { GtkLayoutChild *child = tmp_list->data; tmp_list = tmp_list->next; gtk_layout_position_child (layout, child); gtk_layout_allocate_child (layout, child); } if (GTK_WIDGET_REALIZED (widget)) { gdk_window_move_resize (widget->window, allocation->x, allocation->y, allocation->width, allocation->height); gdk_window_move_resize (GTK_LAYOUT(widget)->bin_window, 0, 0, allocation->width, allocation->height); } layout->hadjustment->page_size = allocation->width; layout->hadjustment->page_increment = allocation->width / 2; layout->hadjustment->lower = 0; layout->hadjustment->upper = layout->width; gtk_signal_emit_by_name (GTK_OBJECT (layout->hadjustment), "changed"); layout->vadjustment->page_size = allocation->height; layout->vadjustment->page_increment = allocation->height / 2; layout->vadjustment->lower = 0; layout->vadjustment->upper = layout->height; gtk_signal_emit_by_name (GTK_OBJECT (layout->vadjustment), "changed");}static void gtk_layout_draw (GtkWidget *widget, GdkRectangle *area){ GList *tmp_list; GtkLayout *layout; GdkRectangle child_area; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_LAYOUT (widget)); layout = GTK_LAYOUT (widget); /* We don't have any way of telling themes about this properly, * so we just assume a background pixmap */ if (!GTK_WIDGET_APP_PAINTABLE (widget)) gdk_window_clear_area (layout->bin_window, area->x, area->y, area->width, area->height); tmp_list = layout->children; while (tmp_list) { GtkLayoutChild *child = tmp_list->data; tmp_list = tmp_list->next; if (gtk_widget_intersect (child->widget, area, &child_area)) gtk_widget_draw (child->widget, &child_area); }}static gint gtk_layout_expose (GtkWidget *widget, GdkEventExpose *event){ GList *tmp_list; GtkLayout *layout; GdkEventExpose child_event; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_LAYOUT (widget), FALSE); layout = GTK_LAYOUT (widget); if (event->window != layout->bin_window) return FALSE; tmp_list = layout->children; while (tmp_list) { GtkLayoutChild *child = tmp_list->data; tmp_list = tmp_list->next; child_event = *event; if (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;}/* Container method */static voidgtk_layout_remove (GtkContainer *container, GtkWidget *widget){ GList *tmp_list; GtkLayout *layout; GtkLayoutChild *child = NULL; g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_LAYOUT (container)); layout = GTK_LAYOUT (container); tmp_list = layout->children; while (tmp_list) { child = tmp_list->data; if (child->widget == widget) break; tmp_list = tmp_list->next; } if (tmp_list) { GTK_PRIVATE_UNSET_FLAG (widget, GTK_IS_OFFSCREEN); gtk_widget_unparent (widget); layout->children = g_list_remove_link (layout->children, tmp_list); g_list_free_1 (tmp_list); g_free (child); }}static voidgtk_layout_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data){ GtkLayout *layout; GtkLayoutChild *child; GList *tmp_list; g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_LAYOUT (container)); g_return_if_fail (callback != NULL); layout = GTK_LAYOUT (container); tmp_list = layout->children; while (tmp_list) { child = tmp_list->data; tmp_list = tmp_list->next; (* callback) (child->widget, callback_data); }}/* Operations on children */static voidgtk_layout_position_child (GtkLayout *layout, GtkLayoutChild *child){ gint x; gint y; x = child->x - layout->xoffset; y = child->y - layout->yoffset; if (IS_ONSCREEN (x,y)) { if (GTK_WIDGET_MAPPED (layout) && GTK_WIDGET_VISIBLE (child->widget)) { if (!GTK_WIDGET_MAPPED (child->widget)) gtk_widget_map (child->widget); } if (GTK_WIDGET_IS_OFFSCREEN (child->widget)) GTK_PRIVATE_UNSET_FLAG (child->widget, GTK_IS_OFFSCREEN); } else { if (!GTK_WIDGET_IS_OFFSCREEN (child->widget)) GTK_PRIVATE_SET_FLAG (child->widget, GTK_IS_OFFSCREEN); if (GTK_WIDGET_MAPPED (child->widget)) gtk_widget_unmap (child->widget); }}static voidgtk_layout_allocate_child (GtkLayout *layout, GtkLayoutChild *child){ GtkAllocation allocation; GtkRequisition requisition; allocation.x = child->x - layout->xoffset; allocation.y = child->y - layout->yoffset; gtk_widget_get_child_requisition (child->widget, &requisition); allocation.width = requisition.width; allocation.height = requisition.height; gtk_widget_size_allocate (child->widget, &allocation);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -