From bb961d062a1c7b7881baefd2489f5cc8929fb0a2 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 27 Apr 2023 22:19:24 +0200 Subject: [PATCH] widget: Handle baseline better When adjusting allocations, treat BASELINE more like CENTER than like FILL. The results are better, in particular for controls like entries or switches, which we never want to scale up vertically, but still want to align to the baseline. --- gtk/gtkwidget.c | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index f8a96ccf6f..3c7c961db5 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -3758,11 +3758,22 @@ static void adjust_for_align (GtkAlign align, int natural_size, int *allocated_pos, - int *allocated_size) + int *allocated_size, + int nat_baseline, + int *allocated_baseline) { switch (align) { case GTK_ALIGN_BASELINE: + if (*allocated_size > natural_size && + nat_baseline > -1 && + *allocated_baseline > -1) + { + *allocated_pos = *allocated_baseline - nat_baseline; + *allocated_size = MIN (*allocated_size, natural_size); + *allocated_baseline = nat_baseline; + } + break; case GTK_ALIGN_FILL: default: /* change nothing */ @@ -3790,11 +3801,13 @@ adjust_for_align (GtkAlign align, static inline void gtk_widget_adjust_size_allocation (GtkWidget *widget, - GtkAllocation *allocation) + GtkAllocation *allocation, + int *baseline) { GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget); int natural_width, natural_height; int min_width, min_height; + int nat_baseline; if (priv->halign == GTK_ALIGN_FILL && priv->valign == GTK_ALIGN_FILL) return; @@ -3816,14 +3829,17 @@ gtk_widget_adjust_size_allocation (GtkWidget *widget, adjust_for_align (effective_align (priv->halign, _gtk_widget_get_direction (widget)), natural_width - priv->margin.left - priv->margin.right, &allocation->x, - &allocation->width); + &allocation->width, + -1, NULL); gtk_widget_measure (widget, GTK_ORIENTATION_VERTICAL, allocation->width + priv->margin.left + priv->margin.right, - &min_height, &natural_height, NULL, NULL); + NULL, &natural_height, NULL, &nat_baseline); adjust_for_align (priv->valign, natural_height - priv->margin.top - priv->margin.bottom, &allocation->y, - &allocation->height); + &allocation->height, + nat_baseline - priv->margin.top, + baseline); } else { @@ -3832,19 +3848,22 @@ gtk_widget_adjust_size_allocation (GtkWidget *widget, &min_height, NULL, NULL, NULL); gtk_widget_measure (widget, GTK_ORIENTATION_VERTICAL, -1, - NULL, &natural_height, NULL, NULL); + NULL, &natural_height, NULL, &nat_baseline); natural_height = MAX (min_height, natural_height); adjust_for_align (priv->valign, - natural_height - priv->margin.top - priv->margin.bottom, + natural_height - priv->margin.top - priv->margin.bottom, &allocation->y, - &allocation->height); + &allocation->height, + nat_baseline - priv->margin.top, + baseline); gtk_widget_measure (widget, GTK_ORIENTATION_HORIZONTAL, allocation->height + priv->margin.top + priv->margin.bottom, &min_width, &natural_width, NULL, NULL); adjust_for_align (effective_align (priv->halign, _gtk_widget_get_direction (widget)), natural_width - priv->margin.left - priv->margin.right, &allocation->x, - &allocation->width); + &allocation->width, + -1, NULL); } } @@ -3972,7 +3991,7 @@ gtk_widget_allocate (GtkWidget *widget, if (baseline >= 0) baseline -= priv->margin.top; - gtk_widget_adjust_size_allocation (widget, &adjusted); + gtk_widget_adjust_size_allocation (widget, &adjusted, &baseline); if (adjusted.width < 0 || adjusted.height < 0) { -- 2.30.2