From f83f80abd8966cece586556332221942cf858c58 Mon Sep 17 00:00:00 2001 From: hujianwei Date: Sun, 23 Oct 2022 06:38:04 +0000 Subject: [PATCH] Fix reusing subsurfaces and XDG surfaces after roles are destroyed * subsurface.c (DestroySubsurface): * xdg_surface.c (Destroy): Release/detach role from surface. --- subsurface.c | 10 ++++++++++ xdg_surface.c | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/subsurface.c b/subsurface.c index 5c81c62..c759004 100644 --- a/subsurface.c +++ b/subsurface.c @@ -320,6 +320,16 @@ RunSurfaceActions (SurfaceAction *first) static void DestroySubsurface (struct wl_client *client, struct wl_resource *resource) { + Subsurface *subsurface; + + subsurface = wl_resource_get_user_data (resource); + + /* Now detach the role from its surface, which can be reused in the + future. */ + if (subsurface->role.surface) + XLSurfaceReleaseRole (subsurface->role.surface, + &subsurface->role); + wl_resource_destroy (resource); } diff --git a/xdg_surface.c b/xdg_surface.c index 4701381..424259a 100644 --- a/xdg_surface.c +++ b/xdg_surface.c @@ -467,6 +467,11 @@ Destroy (struct wl_client *client, struct wl_resource *resource) return; } + /* Now detach the role from its surface, which can be reused in the + future. */ + if (role->role.surface) + XLSurfaceReleaseRole (role->role.surface, &role->role); + wl_resource_destroy (resource); }