summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Mader <robert.mader@posteo.de>2021-04-16 19:38:40 +0200
committerMarge Bot <marge-bot@gnome.org>2021-04-19 11:55:49 +0000
commit6e00e5e6e7c7bab6c2ba408b528e1bdee8f17239 (patch)
treeaf9b3d8b722c396261b576409464c5b13499b54f
parentf7768874e5ec2a808ccec424ed9e238e3dc13987 (diff)
downloadmutter-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>
-rw-r--r--src/wayland/meta-wayland-subsurface.c16
-rw-r--r--src/wayland/meta-wayland-subsurface.h2
2 files changed, 9 insertions, 9 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);
diff --git a/src/wayland/meta-wayland-subsurface.h b/src/wayland/meta-wayland-subsurface.h
index 7ea6bc5ae..45dbf8626 100644
--- a/src/wayland/meta-wayland-subsurface.h
+++ b/src/wayland/meta-wayland-subsurface.h
@@ -40,7 +40,7 @@ typedef struct
MetaWaylandSubsurfacePlacement placement;
MetaWaylandSurface *surface;
MetaWaylandSurface *sibling;
- struct wl_listener surface_destroy_listener;
+ struct wl_listener subsurface_destroy_listener;
struct wl_listener sibling_destroy_listener;
} MetaWaylandSubsurfacePlacementOp;