window-actor/wayland: Improve scanout candidate check
By ignoring obcured surfaces we can generalize the single-pixel-buffer background check to work with arbitrary surface trees, as long as the two top ones are the background and content surfaces. As a nice side effect of this, clients like Firefox now usually take the shorter `meta_window_is_fullscreen (window) && n_visible_surface_actors == 1` route. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3699>
This commit is contained in:
parent
e5068bfc91
commit
1f82365021
@ -350,7 +350,7 @@ meta_window_actor_wayland_get_scanout_candidate (MetaWindowActor *actor)
|
|||||||
ClutterActor *child_actor;
|
ClutterActor *child_actor;
|
||||||
ClutterActorIter iter;
|
ClutterActorIter iter;
|
||||||
MetaSurfaceActor *topmost_surface_actor = NULL;
|
MetaSurfaceActor *topmost_surface_actor = NULL;
|
||||||
int n_mapped_surfaces = 0;
|
int n_visible_surface_actors = 0;
|
||||||
MetaWindow *window;
|
MetaWindow *window;
|
||||||
ClutterActorBox window_box;
|
ClutterActorBox window_box;
|
||||||
ClutterActorBox surface_box;
|
ClutterActorBox surface_box;
|
||||||
@ -365,11 +365,17 @@ meta_window_actor_wayland_get_scanout_candidate (MetaWindowActor *actor)
|
|||||||
clutter_actor_iter_init (&iter, surface_container);
|
clutter_actor_iter_init (&iter, surface_container);
|
||||||
while (clutter_actor_iter_next (&iter, &child_actor))
|
while (clutter_actor_iter_next (&iter, &child_actor))
|
||||||
{
|
{
|
||||||
|
MetaSurfaceActor *surface_actor;
|
||||||
|
|
||||||
if (!clutter_actor_is_mapped (child_actor))
|
if (!clutter_actor_is_mapped (child_actor))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
topmost_surface_actor = META_SURFACE_ACTOR (child_actor);
|
surface_actor = META_SURFACE_ACTOR (child_actor);
|
||||||
n_mapped_surfaces++;
|
if (meta_surface_actor_is_obscured (surface_actor))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
topmost_surface_actor = surface_actor;
|
||||||
|
n_visible_surface_actors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!topmost_surface_actor)
|
if (!topmost_surface_actor)
|
||||||
@ -380,10 +386,10 @@ meta_window_actor_wayland_get_scanout_candidate (MetaWindowActor *actor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
window = meta_window_actor_get_meta_window (actor);
|
window = meta_window_actor_get_meta_window (actor);
|
||||||
if (meta_window_is_fullscreen (window) && n_mapped_surfaces == 1)
|
if (meta_window_is_fullscreen (window) && n_visible_surface_actors == 1)
|
||||||
return topmost_surface_actor;
|
return topmost_surface_actor;
|
||||||
|
|
||||||
if (meta_window_is_fullscreen (window) && n_mapped_surfaces == 2)
|
if (meta_window_is_fullscreen (window) && n_visible_surface_actors == 2)
|
||||||
{
|
{
|
||||||
MetaSurfaceActorWayland *bg_surface_actor = NULL;
|
MetaSurfaceActorWayland *bg_surface_actor = NULL;
|
||||||
MetaWaylandSurface *bg_surface;
|
MetaWaylandSurface *bg_surface;
|
||||||
@ -393,10 +399,16 @@ meta_window_actor_wayland_get_scanout_candidate (MetaWindowActor *actor)
|
|||||||
clutter_actor_iter_init (&iter, surface_container);
|
clutter_actor_iter_init (&iter, surface_container);
|
||||||
while (clutter_actor_iter_next (&iter, &child_actor))
|
while (clutter_actor_iter_next (&iter, &child_actor))
|
||||||
{
|
{
|
||||||
|
MetaSurfaceActor *surface_actor;
|
||||||
|
|
||||||
if (!clutter_actor_is_mapped (child_actor))
|
if (!clutter_actor_is_mapped (child_actor))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bg_surface_actor = META_SURFACE_ACTOR_WAYLAND (child_actor);
|
surface_actor = META_SURFACE_ACTOR (child_actor);
|
||||||
|
if (meta_surface_actor_is_obscured (surface_actor))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bg_surface_actor = META_SURFACE_ACTOR_WAYLAND (surface_actor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
g_assert (bg_surface_actor);
|
g_assert (bg_surface_actor);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user