window-actor/wayland: Ensure to use allocation for black background check

The surface actors may not have a valid allocation when running the
test. The preferred height, which `clutter_actor_get_size()` returns
in that case, can be wrong in certain cases, making us not add the black
background when it's actually needed.

Query the allocation instead, even at the expense of additional
relayouts.

While on it, sneak it some small cleanups.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3024
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3310>
This commit is contained in:
Robert Mader 2023-10-04 22:45:13 +02:00
parent eafe331cf7
commit 8f4ab53bd6

View File

@ -498,24 +498,23 @@ maybe_configure_black_background (MetaWindowActorWayland *self,
clutter_actor_iter_init (&iter, CLUTTER_ACTOR (self->surface_container)); clutter_actor_iter_init (&iter, CLUTTER_ACTOR (self->surface_container));
while (clutter_actor_iter_next (&iter, &child)) while (clutter_actor_iter_next (&iter, &child))
{ {
float child_width, child_height; ClutterActorBox actor_box;
clutter_actor_get_size (child, &child_width, &child_height); if (!clutter_actor_is_mapped (child))
continue;
if (META_IS_SURFACE_ACTOR (child) && clutter_actor_get_allocation_box (child, &actor_box);
meta_surface_actor_is_opaque (META_SURFACE_ACTOR (child)) && if (meta_surface_actor_is_opaque (META_SURFACE_ACTOR (child)) &&
G_APPROX_VALUE (clutter_actor_get_x (child), 0, G_APPROX_VALUE (actor_box.x1, 0, CLUTTER_COORDINATE_EPSILON) &&
G_APPROX_VALUE (actor_box.y1, 0, CLUTTER_COORDINATE_EPSILON) &&
G_APPROX_VALUE (actor_box.x2, fullscreen_layout.width,
CLUTTER_COORDINATE_EPSILON) && CLUTTER_COORDINATE_EPSILON) &&
G_APPROX_VALUE (clutter_actor_get_y (child), 0, G_APPROX_VALUE (actor_box.y2, fullscreen_layout.height,
CLUTTER_COORDINATE_EPSILON) &&
G_APPROX_VALUE (child_width, fullscreen_layout.width,
CLUTTER_COORDINATE_EPSILON) &&
G_APPROX_VALUE (child_height, fullscreen_layout.height,
CLUTTER_COORDINATE_EPSILON)) CLUTTER_COORDINATE_EPSILON))
return FALSE; return FALSE;
max_width = MAX (max_width, child_width); max_width = MAX (max_width, actor_box.x2 - actor_box.x1);
max_height = MAX (max_height, child_height); max_height = MAX (max_height, actor_box.y2 - actor_box.y1);
} }
*surfaces_width = max_width; *surfaces_width = max_width;