summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtkboxlayout.c52
-rw-r--r--testsuite/reftests/meson.build2
-rw-r--r--testsuite/reftests/vbox-with-max-width-chars-label.ref.ui18
-rw-r--r--testsuite/reftests/vbox-with-max-width-chars-label.ui18
4 files changed, 86 insertions, 4 deletions
diff --git a/gtk/gtkboxlayout.c b/gtk/gtkboxlayout.c
index f080748830..99feca37e5 100644
--- a/gtk/gtkboxlayout.c
+++ b/gtk/gtkboxlayout.c
@@ -256,13 +256,48 @@ gtk_box_layout_compute_size (GtkBoxLayout *self,
static void
gtk_box_layout_compute_opposite_size (GtkBoxLayout *self,
GtkWidget *widget,
- int for_size,
int *minimum,
int *natural,
int *min_baseline,
int *nat_baseline)
{
GtkWidget *child;
+ int largest_min = 0, largest_nat = 0;
+
+ for (child = gtk_widget_get_first_child (widget);
+ child != NULL;
+ child = gtk_widget_get_next_sibling (child))
+ {
+ int child_min = 0;
+ int child_nat = 0;
+
+ if (!gtk_widget_should_layout (child))
+ continue;
+
+ gtk_widget_measure (child,
+ OPPOSITE_ORIENTATION (self->orientation),
+ -1,
+ &child_min, &child_nat,
+ NULL, NULL);
+
+ largest_min = MAX (largest_min, child_min);
+ largest_nat = MAX (largest_nat, child_nat);
+ }
+
+ *minimum = largest_min;
+ *natural = largest_nat;
+}
+
+static void
+gtk_box_layout_compute_opposite_size_for_size (GtkBoxLayout *self,
+ GtkWidget *widget,
+ int for_size,
+ int *minimum,
+ int *natural,
+ int *min_baseline,
+ int *nat_baseline)
+{
+ GtkWidget *child;
int nvis_children;
int nexpand_children;
int computed_minimum = 0, computed_natural = 0;
@@ -437,9 +472,18 @@ gtk_box_layout_measure (GtkLayoutManager *layout_manager,
if (self->orientation != orientation)
{
- gtk_box_layout_compute_opposite_size (self, widget, for_size,
- minimum, natural,
- min_baseline, nat_baseline);
+ if (for_size < 0)
+ {
+ gtk_box_layout_compute_opposite_size (self, widget,
+ minimum, natural,
+ min_baseline, nat_baseline);
+ }
+ else
+ {
+ gtk_box_layout_compute_opposite_size_for_size (self, widget, for_size,
+ minimum, natural,
+ min_baseline, nat_baseline);
+ }
}
else
{
diff --git a/testsuite/reftests/meson.build b/testsuite/reftests/meson.build
index b033760ed7..692a427438 100644
--- a/testsuite/reftests/meson.build
+++ b/testsuite/reftests/meson.build
@@ -498,6 +498,8 @@ testdata = [
'unresolvable.css',
'unresolvable.ref.ui',
'unresolvable.ui',
+ 'vbox-with-max-width-chars-label.ref.ui',
+ 'vbox-with-max-width-chars-label.ui',
'window-border-width.ref.ui',
'window-border-width.ui',
'window-default-size.ref.ui',
diff --git a/testsuite/reftests/vbox-with-max-width-chars-label.ref.ui b/testsuite/reftests/vbox-with-max-width-chars-label.ref.ui
new file mode 100644
index 0000000000..aa732c608d
--- /dev/null
+++ b/testsuite/reftests/vbox-with-max-width-chars-label.ref.ui
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <object class="GtkWindow">
+ <property name="decorated">0</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">horizontal</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label">Hello World</property>
+ <property name="wrap">1</property>
+ <property name="max-width-chars">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/testsuite/reftests/vbox-with-max-width-chars-label.ui b/testsuite/reftests/vbox-with-max-width-chars-label.ui
new file mode 100644
index 0000000000..3a7d52e4a4
--- /dev/null
+++ b/testsuite/reftests/vbox-with-max-width-chars-label.ui
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <object class="GtkWindow">
+ <property name="decorated">0</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label">Hello World</property>
+ <property name="wrap">1</property>
+ <property name="max-width-chars">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>