From d3a2218ff4acac12aeb443f4f2a6aca64e97298f Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 9 Feb 2019 03:03:59 +0100 Subject: [PATCH] widget: Split up priv->allocation It's not priv->transform (to be turned into a graphene matrix), priv->width and priv->height. The numbers are still the same. The only difference is that unallocated widgets will now have x/y set to 0, not to -1. --- gtk/gtkwidget.c | 76 ++++++++++++++++++++++-------------------- gtk/gtkwidgetprivate.h | 16 +++++++-- 2 files changed, 52 insertions(+), 40 deletions(-) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 9207a46b1d..39f50c3241 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -2810,10 +2810,6 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class) priv->visible = gtk_widget_class_get_visible_by_default (g_class); priv->child_visible = TRUE; priv->name = NULL; - priv->allocation.x = -1; - priv->allocation.y = -1; - priv->allocation.width = 0; - priv->allocation.height = 0; priv->user_alpha = 255; priv->alpha = 255; priv->surface = NULL; @@ -2822,7 +2818,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class) priv->last_child = NULL; priv->prev_sibling = NULL; priv->next_sibling = NULL; - priv->allocated_baseline = -1; + priv->baseline = -1; priv->allocated_size_baseline = -1; priv->sensitive = TRUE; @@ -3044,8 +3040,8 @@ gtk_widget_unparent (GtkWidget *widget) /* Reset the width and height here, to force reallocation if we * get added back to a new parent. */ - priv->allocation.width = 0; - priv->allocation.height = 0; + priv->width = 0; + priv->height = 0; if (_gtk_widget_get_realized (widget)) gtk_widget_unrealize (widget); @@ -4233,15 +4229,18 @@ gtk_widget_size_allocate (GtkWidget *widget, real_allocation.height = MAX (1, real_allocation.height); } - baseline_changed = priv->allocated_baseline != baseline; - size_changed = (priv->allocation.width != real_allocation.width || - priv->allocation.height != real_allocation.height); - position_changed = (priv->allocation.x != real_allocation.x || - priv->allocation.y != real_allocation.y); + baseline_changed = priv->baseline != baseline; + size_changed = (priv->width != real_allocation.width || + priv->height != real_allocation.height); + position_changed = (priv->transform.x != real_allocation.x || + priv->transform.y != real_allocation.y); /* Set the widget allocation to real_allocation now, pass the smaller allocation to the vfunc */ - priv->allocation = real_allocation; - priv->allocated_baseline = baseline; + priv->transform.x = real_allocation.x; + priv->transform.y = real_allocation.y; + priv->width = real_allocation.width; + priv->height = real_allocation.height; + priv->baseline = baseline; if (!alloc_needed && !size_changed && !baseline_changed) { @@ -4390,8 +4389,8 @@ gtk_widget_get_origin_relative_to_parent (GtkWidget *widget, get_box_padding (style, &padding); /* allocation is relative to the parent's origin */ - *origin_x = priv->allocation.x; - *origin_y = priv->allocation.y; + *origin_x = priv->transform.x; + *origin_y = priv->transform.y; /* ... but points to the upper left, excluding widget margins * but including all the css properties */ @@ -6185,10 +6184,10 @@ _gtk_widget_set_visible_flag (GtkWidget *widget, if (!visible) { - priv->allocation.x = -1; - priv->allocation.y = -1; - priv->allocation.width = 0; - priv->allocation.height = 0; + priv->transform.x = 0; + priv->transform.y = 0; + priv->width = 0; + priv->height = 0; memset (&priv->allocated_size, 0, sizeof (priv->allocated_size)); priv->allocated_size_baseline = 0; gtk_widget_update_paintables (widget); @@ -6278,8 +6277,8 @@ gtk_widget_set_has_surface (GtkWidget *widget, priv->no_surface_set = TRUE; /* GdkSurface has a min size of 1×1 */ - priv->allocation.width = 1; - priv->allocation.height = 1; + priv->width = 1; + priv->height = 1; } /** @@ -11134,7 +11133,10 @@ gtk_widget_get_allocation (GtkWidget *widget, g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (allocation != NULL); - *allocation = priv->allocation; + allocation->x = priv->transform.x; + allocation->y = priv->transform.y; + allocation->width = priv->width; + allocation->height = priv->height; } /** @@ -11226,8 +11228,8 @@ gtk_widget_pick (GtkWidget *widget, if (x < -padding.left || y < -padding.top || - x >= priv->allocation.width - margin.left - margin.right - border.left - border.right - padding.left || - y >= priv->allocation.height - margin.top - margin.bottom - border.top - border.bottom - padding.top) + x >= priv->width - margin.left - margin.right - border.left - border.right - padding.left || + y >= priv->height - margin.top - margin.bottom - border.top - border.bottom - padding.top) return NULL; } break; @@ -11275,8 +11277,8 @@ gtk_widget_compute_bounds (GtkWidget *widget, alloc.x = - (padding.left + border.left); alloc.y = - (padding.top + border.top); - alloc.width = priv->allocation.width - margin.left - margin.right; - alloc.height = priv->allocation.height -margin.top - margin.bottom; + alloc.width = priv->width - margin.left - margin.right; + alloc.height = priv->height - margin.top - margin.bottom; if (!gtk_widget_translate_coordinates (widget, target, @@ -11311,7 +11313,7 @@ gtk_widget_get_allocated_width (GtkWidget *widget) g_return_val_if_fail (GTK_IS_WIDGET (widget), 0); - return priv->allocation.width; + return priv->width; } /** @@ -11329,7 +11331,7 @@ gtk_widget_get_allocated_height (GtkWidget *widget) g_return_val_if_fail (GTK_IS_WIDGET (widget), 0); - return priv->allocation.height; + return priv->height; } /** @@ -11352,7 +11354,7 @@ gtk_widget_get_allocated_baseline (GtkWidget *widget) g_return_val_if_fail (GTK_IS_WIDGET (widget), 0); - if (priv->allocated_baseline == -1) + if (priv->baseline == -1) return -1; style = gtk_css_node_get_style (priv->cssnode); @@ -11360,7 +11362,7 @@ gtk_widget_get_allocated_baseline (GtkWidget *widget) get_box_border (style, &border); get_box_padding (style, &padding); - return priv->allocated_baseline - margin.top - border.top - padding.top; + return priv->baseline - margin.top - border.top - padding.top; } /** @@ -12977,7 +12979,7 @@ gtk_widget_maybe_add_debug_render_nodes (GtkWidget *widget, graphene_rect_init (&bounds, 0, margin.top + border.top + padding.top + baseline, - priv->allocation.width, 1); + priv->width, 1); gtk_snapshot_append_color (snapshot, &red, &bounds); @@ -12992,7 +12994,7 @@ gtk_widget_maybe_add_debug_render_nodes (GtkWidget *widget, graphene_rect_init (&bounds, 0, 0, - priv->allocation.width, priv->allocation.height); + priv->width, priv->height); gtk_snapshot_append_color (snapshot, &blue, @@ -13465,8 +13467,8 @@ gtk_widget_snapshot_child (GtkWidget *widget, g_return_if_fail (_gtk_widget_get_parent (child) == widget); g_return_if_fail (snapshot != NULL); - x = priv->allocation.x; - y = priv->allocation.y; + x = priv->transform.x; + y = priv->transform.y; gtk_snapshot_offset (snapshot, x, y); gtk_widget_snapshot (child, snapshot); @@ -13668,7 +13670,7 @@ gtk_widget_get_width (GtkWidget *widget) get_box_border (style, &border); get_box_padding (style, &padding); - return priv->allocation.width - + return priv->width - margin.left - margin.right - border.left - border.right - padding.left - padding.right; @@ -13698,7 +13700,7 @@ gtk_widget_get_height (GtkWidget *widget) get_box_border (style, &border); get_box_padding (style, &padding); - return priv->allocation.height - + return priv->height - margin.top - margin.bottom - border.top - border.bottom - padding.top - padding.bottom; diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h index 26c33ba0bc..6aa41f2430 100644 --- a/gtk/gtkwidgetprivate.h +++ b/gtk/gtkwidgetprivate.h @@ -141,8 +141,13 @@ struct _GtkWidgetPrivate /* The widget's allocated size */ GtkAllocation allocated_size; gint allocated_size_baseline; - GtkAllocation allocation; - gint allocated_baseline; + struct { + int x; + int y; + } transform; + int width; + int height; + int baseline; /* The widget's requested sizes */ SizeRequestCache requests; @@ -455,7 +460,12 @@ static inline void _gtk_widget_get_allocation (GtkWidget *widget, GtkAllocation *allocation) { - *allocation = widget->priv->allocation; + GtkWidgetPrivate *priv = widget->priv; + + allocation->x = priv->transform.x; + allocation->y = priv->transform.y; + allocation->width = priv->width; + allocation->height = priv->height; } static inline GtkWidget *