diff options
author | Robert Mader <robert.mader@posteo.de> | 2021-04-16 19:38:40 +0200 |
---|---|---|
committer | Marge Bot <marge-bot@gnome.org> | 2021-04-19 11:55:49 +0000 |
commit | 6e00e5e6e7c7bab6c2ba408b528e1bdee8f17239 (patch) | |
tree | af9b3d8b722c396261b576409464c5b13499b54f /src/wayland/meta-wayland-subsurface.c | |
parent | f7768874e5ec2a808ccec424ed9e238e3dc13987 (diff) | |
download | mutter-6e00e5e6e7c7bab6c2ba408b528e1bdee8f17239.tar.gz |
wayland/subsurface: Avoid placement ops for detached subsurfaces
If a subsurface first gets reordered and afterwards detached from
the parent before the parent surface got commited, we currently
would end up reattaching the subsurface to its previous parent.
While clients should avoid this behaviour, it's legit according
to the spec.
We already prevent similar cases where the subsurface is destroyed -
extend that check to detaching, which includes the destroy case.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1831>
Diffstat (limited to 'src/wayland/meta-wayland-subsurface.c')
-rw-r--r-- | src/wayland/meta-wayland-subsurface.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/wayland/meta-wayland-subsurface.c b/src/wayland/meta-wayland-subsurface.c index 27bd91f0c..d7f56b66e 100644 --- a/src/wayland/meta-wayland-subsurface.c +++ b/src/wayland/meta-wayland-subsurface.c @@ -355,11 +355,11 @@ is_valid_sibling (MetaWaylandSurface *surface, } static void -subsurface_handle_pending_surface_destroyed (struct wl_listener *listener, - void *data) +subsurface_handle_pending_subsurface_destroyed (struct wl_listener *listener, + void *data) { MetaWaylandSubsurfacePlacementOp *op = - wl_container_of (listener, op, surface_destroy_listener); + wl_container_of (listener, op, subsurface_destroy_listener); op->surface = NULL; } @@ -378,7 +378,7 @@ void meta_wayland_subsurface_placement_op_free (MetaWaylandSubsurfacePlacementOp *op) { if (op->surface) - wl_list_remove (&op->surface_destroy_listener.link); + wl_list_remove (&op->subsurface_destroy_listener.link); if (op->sibling) wl_list_remove (&op->sibling_destroy_listener.link); g_free (op); @@ -396,12 +396,12 @@ queue_subsurface_placement (MetaWaylandSurface *surface, op->placement = placement; op->surface = surface; op->sibling = sibling; - op->surface_destroy_listener.notify = - subsurface_handle_pending_surface_destroyed; + op->subsurface_destroy_listener.notify = + subsurface_handle_pending_subsurface_destroyed; op->sibling_destroy_listener.notify = subsurface_handle_pending_sibling_destroyed; - wl_resource_add_destroy_listener (surface->resource, - &op->surface_destroy_listener); + wl_resource_add_destroy_listener (surface->wl_subsurface, + &op->subsurface_destroy_listener); wl_resource_add_destroy_listener (sibling->resource, &op->sibling_destroy_listener); |