diff options
-rw-r--r-- | gtk/gtkboxlayout.c | 52 | ||||
-rw-r--r-- | testsuite/reftests/meson.build | 2 | ||||
-rw-r--r-- | testsuite/reftests/vbox-with-max-width-chars-label.ref.ui | 18 | ||||
-rw-r--r-- | testsuite/reftests/vbox-with-max-width-chars-label.ui | 18 |
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> |