From: Matthias Clasen Date: Thu, 27 Apr 2023 20:19:24 +0000 (+0200) Subject: widget: Handle baseline better X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~355^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=bb961d062a1c7b7881baefd2489f5cc8929fb0a2;p=gtk4.git 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. --- 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) {