From: Benjamin Otte Date: Mon, 18 Oct 2021 23:04:25 +0000 (+0200) Subject: label: Never measure more than max-width-chars X-Git-Tag: archive/raspbian/4.6.5+ds-1+rpi1~1^2~19^2~5^2~229^2~3 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ba44e7a228534ff066694ad97d25eaa23ec5f3af;p=gtk4.git label: Never measure more than max-width-chars Even when we have tons of width available, still do the wrapping at max-width-chars. This is what happened in GTK3, too, but it happened automatically because GTK3 did for_size = MIN (for_size, nat_size) and GTK4 does not. So we do this manually in the label now. Fixes the label-sizing.ui reftest. --- diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index e94615473d..661902a275 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -1017,6 +1017,23 @@ gtk_label_get_measuring_layout (GtkLabel *self, return copy; } +static int +get_char_pixels (GtkWidget *self, + PangoLayout *layout) +{ + PangoContext *context; + PangoFontMetrics *metrics; + int char_width, digit_width; + + context = pango_layout_get_context (layout); + metrics = pango_context_get_metrics (context, NULL, NULL); + char_width = pango_font_metrics_get_approximate_char_width (metrics); + digit_width = pango_font_metrics_get_approximate_digit_width (metrics); + pango_font_metrics_unref (metrics); + + return MAX (char_width, digit_width); +} + static void get_height_for_width (GtkLabel *self, int width, @@ -1028,7 +1045,20 @@ get_height_for_width (GtkLabel *self, PangoLayout *layout; int text_height, baseline; - layout = gtk_label_get_measuring_layout (self, NULL, width * PANGO_SCALE); + width *= PANGO_SCALE; + if (self->max_width_chars > -1) + { + int char_pixels, width_chars; + + layout = gtk_label_get_measuring_layout (self, NULL, -1); + char_pixels = get_char_pixels (GTK_WIDGET (self), layout); + if (self->width_chars > self->max_width_chars) + width_chars = self->width_chars; + else + width_chars = self->max_width_chars; + width = MIN (char_pixels * width_chars, width); + } + layout = gtk_label_get_measuring_layout (self, NULL, width); pango_layout_get_pixel_size (layout, NULL, &text_height); @@ -1042,23 +1072,6 @@ get_height_for_width (GtkLabel *self, g_object_unref (layout); } -static int -get_char_pixels (GtkWidget *self, - PangoLayout *layout) -{ - PangoContext *context; - PangoFontMetrics *metrics; - int char_width, digit_width; - - context = pango_layout_get_context (layout); - metrics = pango_context_get_metrics (context, NULL, NULL); - char_width = pango_font_metrics_get_approximate_char_width (metrics); - digit_width = pango_font_metrics_get_approximate_digit_width (metrics); - pango_font_metrics_unref (metrics); - - return MAX (char_width, digit_width); -} - static void gtk_label_get_preferred_layout_size (GtkLabel *self, PangoRectangle *smallest,