mirror of
https://github.com/brl/mutter.git
synced 2025-02-17 05:44:08 +00:00
window-actor/wayland: Ignore unmapped subsurfaces in direct scanout check
Clients expect us to ignore them, thus do so. Right now, if the topmost subsurface is an unmapped subsurface, it will fail the `meta_surface_actor_is_opaque()` check if it was never mapped before. Further more, unmapped subsurfaces would wrongly disable our "only one surface and fullscreen" optimization. Closes https://gitlab.gnome.org/GNOME/mutter/-/issues/2550 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2755>
This commit is contained in:
parent
35ecaafd6b
commit
3d618d5e45
@ -298,8 +298,10 @@ meta_window_actor_wayland_get_scanout_candidate (MetaWindowActor *actor)
|
|||||||
MetaWindowActorWayland *self = META_WINDOW_ACTOR_WAYLAND (actor);
|
MetaWindowActorWayland *self = META_WINDOW_ACTOR_WAYLAND (actor);
|
||||||
ClutterActor *surface_container = CLUTTER_ACTOR (self->surface_container);
|
ClutterActor *surface_container = CLUTTER_ACTOR (self->surface_container);
|
||||||
ClutterActor *child_actor;
|
ClutterActor *child_actor;
|
||||||
MetaSurfaceActor *topmost_surface_actor;
|
ClutterActorIter iter;
|
||||||
|
MetaSurfaceActor *topmost_surface_actor = NULL;
|
||||||
MetaWindow *window;
|
MetaWindow *window;
|
||||||
|
int n_mapped_surfaces = 0;
|
||||||
|
|
||||||
if (clutter_actor_get_last_child (CLUTTER_ACTOR (self)) != surface_container)
|
if (clutter_actor_get_last_child (CLUTTER_ACTOR (self)) != surface_container)
|
||||||
{
|
{
|
||||||
@ -308,20 +310,26 @@ meta_window_actor_wayland_get_scanout_candidate (MetaWindowActor *actor)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
child_actor = clutter_actor_get_last_child (surface_container);
|
clutter_actor_iter_init (&iter, surface_container);
|
||||||
if (!child_actor)
|
while (clutter_actor_iter_next (&iter, &child_actor))
|
||||||
|
{
|
||||||
|
if (!clutter_actor_is_mapped (child_actor))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
topmost_surface_actor = META_SURFACE_ACTOR (child_actor);
|
||||||
|
n_mapped_surfaces++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!topmost_surface_actor)
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_RENDER,
|
meta_topic (META_DEBUG_RENDER,
|
||||||
"No surface-actor for window-actor");
|
"No surface-actor for window-actor");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
topmost_surface_actor = META_SURFACE_ACTOR (child_actor);
|
|
||||||
|
|
||||||
window = meta_window_actor_get_meta_window (actor);
|
window = meta_window_actor_get_meta_window (actor);
|
||||||
if (!meta_surface_actor_is_opaque (topmost_surface_actor) &&
|
if (!meta_surface_actor_is_opaque (topmost_surface_actor) &&
|
||||||
!(meta_window_is_fullscreen (window) &&
|
!(meta_window_is_fullscreen (window) && n_mapped_surfaces == 1))
|
||||||
clutter_actor_get_n_children (surface_container) == 1))
|
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_RENDER,
|
meta_topic (META_DEBUG_RENDER,
|
||||||
"Window-actor is not opaque");
|
"Window-actor is not opaque");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user