label: max-width-chars has no effect on smaller text
authorBenjamin Otte <otte@redhat.com>
Sat, 6 Nov 2021 15:17:59 +0000 (16:17 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 9 Nov 2021 02:41:43 +0000 (03:41 +0100)
Having a short text and a large max-width-chars should request the
natural width of the text, not the limit from max-width-chars.

This caused huge message dialogs.

Reftests added.

gtk/gtklabel.c
testsuite/reftests/label-huge-max-width-chars.ref.ui [new file with mode: 0644]
testsuite/reftests/label-huge-max-width-chars.ui [new file with mode: 0644]
testsuite/reftests/label-wrapped-huge-max-width-chars.ref.ui [new file with mode: 0644]
testsuite/reftests/label-wrapped-huge-max-width-chars.ui [new file with mode: 0644]
testsuite/reftests/meson.build

index 3c3be854069d4cdbf11755dba11b4a6b63337bc2..46af2fb17442fd870c3bba6177d8f0f491cafb92 100644 (file)
@@ -1077,14 +1077,15 @@ get_static_size (GtkLabel       *self,
                  int            *minimum_baseline,
                  int            *natural_baseline)
 {
+  int minimum_default, natural_default;
   PangoLayout *layout;
 
-  layout = gtk_label_get_measuring_layout (self, NULL, -1);
+  get_default_widths (self, &minimum_default, &natural_default);
+
+  layout = gtk_label_get_measuring_layout (self, NULL, natural_default);
 
   if (orientation == GTK_ORIENTATION_HORIZONTAL)
     {
-      int minimum_default, natural_default;
-
       pango_layout_get_size (layout, natural, NULL);
       if (self->ellipsize)
         {
@@ -1096,11 +1097,8 @@ get_static_size (GtkLabel       *self,
       else
         *minimum = *natural;
 
-      get_default_widths (self, &minimum_default, &natural_default);
       if (minimum_default > *minimum)
         *minimum = minimum_default;
-      if (natural_default > -1)
-        *natural = natural_default;
       *natural = MAX (*minimum, *natural);
     }
   else
@@ -1180,7 +1178,6 @@ get_width_for_height (GtkLabel *self,
       /* Natural width is natural width - or as wide as possible */
       layout = gtk_label_get_measuring_layout (self, layout, natural_default);
       pango_layout_get_size (layout, natural_width, NULL);
-      *natural_width = MAX (*natural_width, natural_default);
       *natural_width = MAX (*natural_width, *minimum_width);
     }
   else
diff --git a/testsuite/reftests/label-huge-max-width-chars.ref.ui b/testsuite/reftests/label-huge-max-width-chars.ref.ui
new file mode 100644 (file)
index 0000000..ec722f5
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow" id="window1">
+    <property name="decorated">0</property>
+    <child>
+      <object class="GtkLabel" id="label1">
+        <property name="label">Hello World</property>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/testsuite/reftests/label-huge-max-width-chars.ui b/testsuite/reftests/label-huge-max-width-chars.ui
new file mode 100644 (file)
index 0000000..bf1237c
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow" id="window1">
+    <property name="decorated">0</property>
+    <child>
+      <object class="GtkLabel" id="label1">
+        <property name="label">Hello World</property>
+        <property name="max-width-chars">1000</property>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/testsuite/reftests/label-wrapped-huge-max-width-chars.ref.ui b/testsuite/reftests/label-wrapped-huge-max-width-chars.ref.ui
new file mode 100644 (file)
index 0000000..5ec6dea
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow" id="window1">
+    <property name="decorated">0</property>
+    <child>
+      <object class="GtkLabel" id="label1">
+        <property name="label">Hello World</property>
+        <property name="wrap">1</property>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/testsuite/reftests/label-wrapped-huge-max-width-chars.ui b/testsuite/reftests/label-wrapped-huge-max-width-chars.ui
new file mode 100644 (file)
index 0000000..cc21161
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <object class="GtkWindow" id="window1">
+    <property name="decorated">0</property>
+    <child>
+      <object class="GtkLabel" id="label1">
+        <property name="label">Hello World</property>
+        <property name="max-width-chars">1000</property>
+        <property name="wrap">1</property>
+      </object>
+    </child>
+  </object>
+</interface>
index 7917c1d3888ec5e8417576d13e0ed697023b5975..d6857190cf843e0c00e7e2415a7aaec280b93dd7 100644 (file)
@@ -347,6 +347,8 @@ testdata = [
   'label-fonts.css',
   'label-fonts.ref.ui',
   'label-fonts.ui',
+  'label-huge-max-width-chars.ref.ui',
+  'label-huge-max-width-chars.ui',
   'label-max-width-chars-and-halign-and-infinite-width.ui',
   'label-max-width-chars-and-halign-and-infinite-width.ref.ui',
   'label-shadows.css',
@@ -365,6 +367,8 @@ testdata = [
   'label-text-shadow-changes-modify-clip.ui',
   'label-width-chars-dont-shrink.ref.ui',
   'label-width-chars-dont-shrink.ui',
+  'label-wrapped-huge-max-width-chars.ref.ui',
+  'label-wrapped-huge-max-width-chars.ui',
   # this seems to make assumptions on text positioning
   # that are not valid with subpixel positioning
   #'label-wrap-justify.ref.ui',