From e73530e6e789bc94b02fe46089d7ab6c4b1ed246 Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Wed, 4 Jan 2023 00:37:32 -0500 Subject: [PATCH] wlr_compositor: Send leave event when output is destroyed Fixes: #3559 --- types/wlr_compositor.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/types/wlr_compositor.c b/types/wlr_compositor.c index 83c98ffcc..1df8ef220 100644 --- a/types/wlr_compositor.c +++ b/types/wlr_compositor.c @@ -897,11 +897,24 @@ static void surface_handle_output_bind(struct wl_listener *listener, } } +static void surface_send_leave(struct wlr_surface_output *surface_output) { + struct wl_client *client = wl_resource_get_client(surface_output->surface->resource); + + struct wl_resource *resource; + wl_resource_for_each(resource, &surface_output->output->resources) { + if (client == wl_resource_get_client(resource)) { + wl_surface_send_leave(surface_output->surface->resource, resource); + } + } + + surface_output_destroy(surface_output); +} + static void surface_handle_output_destroy(struct wl_listener *listener, void *data) { struct wlr_surface_output *surface_output = wl_container_of(listener, surface_output, destroy); - surface_output_destroy(surface_output); + surface_send_leave(surface_output); } void wlr_surface_send_enter(struct wlr_surface *surface, @@ -939,19 +952,12 @@ void wlr_surface_send_enter(struct wlr_surface *surface, void wlr_surface_send_leave(struct wlr_surface *surface, struct wlr_output *output) { - struct wl_client *client = wl_resource_get_client(surface->resource); struct wlr_surface_output *surface_output, *tmp; - struct wl_resource *resource; wl_list_for_each_safe(surface_output, tmp, &surface->current_outputs, link) { if (surface_output->output == output) { - surface_output_destroy(surface_output); - wl_resource_for_each(resource, &output->resources) { - if (client == wl_resource_get_client(resource)) { - wl_surface_send_leave(surface->resource, resource); - } - } + surface_send_leave(surface_output); break; } }