aboutsummaryrefslogtreecommitdiff
path: root/xwayland
diff options
context:
space:
mode:
authorKirill Primak <vyivel@eclair.cafe>2023-07-06 21:55:02 +0300
committerSimon Ser <contact@emersion.fr>2023-07-10 10:03:24 +0200
commitfce7cb249f1295fd96950c5edfc7944253e40012 (patch)
tree7f0429ed51cdf536fbc57f25ac7910cc7348385c /xwayland
parentdc7686c114f8d50d21dba71448f5aa7a8cdc06c6 (diff)
xwayland-shell: don't remove inert role resource
Diffstat (limited to 'xwayland')
-rw-r--r--xwayland/shell.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/xwayland/shell.c b/xwayland/shell.c
index 87008c6b..86ee59f4 100644
--- a/xwayland/shell.c
+++ b/xwayland/shell.c
@@ -15,6 +15,13 @@ static void destroy_resource(struct wl_client *client,
static const struct xwayland_shell_v1_interface shell_impl;
static const struct xwayland_surface_v1_interface xwl_surface_impl;
+static void xwl_surface_destroy(struct wlr_xwayland_surface_v1 *xwl_surface) {
+ wl_list_remove(&xwl_surface->surface_destroy.link);
+ wl_list_remove(&xwl_surface->link);
+ wl_resource_set_user_data(xwl_surface->resource, NULL); // make inert
+ free(xwl_surface);
+}
+
/**
* Get a struct wlr_xwayland_shell_v1 from a resource.
*/
@@ -39,6 +46,9 @@ static struct wlr_xwayland_surface_v1 *xwl_surface_from_resource(
static void xwl_surface_role_commit(struct wlr_surface *surface) {
struct wlr_xwayland_surface_v1 *xwl_surface = xwl_surface_from_resource(surface->role_resource);
+ if (xwl_surface == NULL) {
+ return;
+ }
if (xwl_surface->serial != 0 && !xwl_surface->added) {
xwl_surface->added = true;
@@ -49,10 +59,11 @@ static void xwl_surface_role_commit(struct wlr_surface *surface) {
static void xwl_surface_role_destroy(struct wlr_surface *surface) {
struct wlr_xwayland_surface_v1 *xwl_surface = xwl_surface_from_resource(surface->role_resource);
- wl_list_remove(&xwl_surface->surface_destroy.link);
- wl_list_remove(&xwl_surface->link);
- wl_resource_set_user_data(xwl_surface->resource, NULL); // make inert
- free(xwl_surface);
+ if (xwl_surface == NULL) {
+ return;
+ }
+
+ xwl_surface_destroy(xwl_surface);
}
static const struct wlr_surface_role xwl_surface_role = {
@@ -88,7 +99,7 @@ static void xwl_surface_handle_surface_destroy(struct wl_listener *listener,
void *data) {
struct wlr_xwayland_surface_v1 *xwl_surface =
wl_container_of(listener, xwl_surface, surface_destroy);
- wlr_surface_destroy_role_object(xwl_surface->surface);
+ xwl_surface_destroy(xwl_surface);
}
static void shell_handle_get_xwayland_surface(struct wl_client *client,
@@ -195,7 +206,7 @@ void wlr_xwayland_shell_v1_destroy(struct wlr_xwayland_shell_v1 *shell) {
struct wlr_xwayland_surface_v1 *xwl_surface, *tmp;
wl_list_for_each_safe(xwl_surface, tmp, &shell->surfaces, link) {
- wlr_surface_destroy_role_object(xwl_surface->surface);
+ xwl_surface_destroy(xwl_surface);
}
wl_list_remove(&shell->display_destroy.link);