diff --git a/types/output/output.c b/types/output/output.c index 08a71d832..e405a28d3 100644 --- a/types/output/output.c +++ b/types/output/output.c @@ -451,12 +451,13 @@ void wlr_output_destroy(struct wlr_output *output) { } wl_list_remove(&output->display_destroy.link); - wlr_output_destroy_global(output); output_clear_back_buffer(output); wl_signal_emit_mutable(&output->events.destroy, output); wlr_addon_set_finish(&output->addons); + wlr_output_destroy_global(output); + // The backend is responsible for free-ing the list of modes struct wlr_output_cursor *cursor, *tmp_cursor; diff --git a/types/wlr_compositor.c b/types/wlr_compositor.c index 70c1f9cc5..00e505de7 100644 --- a/types/wlr_compositor.c +++ b/types/wlr_compositor.c @@ -954,11 +954,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, @@ -996,19 +1009,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; } }