clutter/box-layout: Request the correct size for homogeneous layouts

In case the layout is homogeneous, all children aligned by the box
layout must be allocated the same size. In order to fit them all inside
the container, the size request of the box layout has to look for the
child with the largest size and use that size for all children.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2737

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1333
This commit is contained in:
Jonas Dreßler 2020-06-28 14:13:23 +02:00 committed by Florian Müllner
parent 77dc3a5065
commit c2146b457e

View File

@ -475,8 +475,10 @@ get_preferred_size_for_orientation (ClutterBoxLayout *self,
ClutterActor *child; ClutterActor *child;
gint n_children = 0; gint n_children = 0;
gfloat minimum, natural; gfloat minimum, natural;
float largest_min_size, largest_nat_size;
minimum = natural = 0; minimum = natural = 0;
largest_min_size = largest_nat_size = 0;
clutter_actor_iter_init (&iter, container); clutter_actor_iter_init (&iter, container);
while (clutter_actor_iter_next (&iter, &child)) while (clutter_actor_iter_next (&iter, &child))
@ -491,9 +493,23 @@ get_preferred_size_for_orientation (ClutterBoxLayout *self,
get_child_size (child, priv->orientation, get_child_size (child, priv->orientation,
for_size, &child_min, &child_nat); for_size, &child_min, &child_nat);
if (priv->is_homogeneous)
{
largest_min_size = MAX (largest_min_size, child_min);
largest_nat_size = MAX (largest_nat_size, child_nat);
}
else
{
minimum += child_min; minimum += child_min;
natural += child_nat; natural += child_nat;
} }
}
if (priv->is_homogeneous)
{
minimum = largest_min_size * n_children;
natural = largest_nat_size * n_children;
}
if (n_children > 1) if (n_children > 1)
{ {