wayland/subsurface: Only show subsurface if parent is mapped

The spec states:
```
A sub-surface becomes mapped, when a non-NULL wl_buffer is applied
and the parent surface is mapped. The order of which one happens
first is irrelevant. A sub-surface is hidden if the parent becomes hidden,
or if a NULL wl_buffer is applied. These rules apply recursively
through the tree of surfaces.
```

In the past we relied on Clutter actor behaviour to realize the recursive
part - which then broke in
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/664
when we changed the actor hierachy in regards to subsurfaces.

Explicitly encode the desired behaviour in `MetaWaylandSubsurface`, fixing
the issue and making it future proof.

Closes https://gitlab.gnome.org/GNOME/mutter/-/issues/1384
This commit is contained in:
Robert Mader 2020-10-14 18:50:05 +02:00
parent df65f05e27
commit ae0d48b6fd

View File

@ -67,6 +67,17 @@ transform_subsurface_position (MetaWaylandSurface *surface,
while (surface); while (surface);
} }
static gboolean
should_show (MetaWaylandSurface *surface)
{
if (!surface->buffer_ref->buffer)
return FALSE;
else if (surface->sub.parent)
return should_show (surface->sub.parent);
else
return TRUE;
}
static void static void
sync_actor_subsurface_state (MetaWaylandSurface *surface) sync_actor_subsurface_state (MetaWaylandSurface *surface)
{ {
@ -87,7 +98,7 @@ sync_actor_subsurface_state (MetaWaylandSurface *surface)
clutter_actor_set_position (actor, x, y); clutter_actor_set_position (actor, x, y);
clutter_actor_set_reactive (actor, TRUE); clutter_actor_set_reactive (actor, TRUE);
if (surface->buffer_ref->buffer) if (should_show (surface))
clutter_actor_show (actor); clutter_actor_show (actor);
else else
clutter_actor_hide (actor); clutter_actor_hide (actor);