From 3364eec07e91eb51f770f2f7d619a07d96c0b5c4 Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Thu, 12 Aug 2021 21:30:58 +0200 Subject: [PATCH] layer-shell: replace close() with destroy() The protocol specifies that all requests (aside from destroy) are ignored after the compositor sends the closed event. Therefore, destroying the wlroots object and rendering the resource inert when sending the closed event keeps things simpler for wlroots and compositors. --- include/wlr/types/wlr_layer_shell_v1.h | 7 ++++--- types/wlr_layer_shell_v1.c | 29 +++++++++----------------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/include/wlr/types/wlr_layer_shell_v1.h b/include/wlr/types/wlr_layer_shell_v1.h index 846b9466..6f951556 100644 --- a/include/wlr/types/wlr_layer_shell_v1.h +++ b/include/wlr/types/wlr_layer_shell_v1.h @@ -70,7 +70,7 @@ struct wlr_layer_surface_v1 { char *namespace; - bool added, configured, mapped, closed; + bool added, configured, mapped; uint32_t configure_serial; uint32_t configure_next_serial; struct wl_list configure_list; @@ -125,9 +125,10 @@ void wlr_layer_surface_v1_configure(struct wlr_layer_surface_v1 *surface, uint32_t width, uint32_t height); /** - * Unmaps this layer surface and notifies the client that it has been closed. + * Notify the client that the surface has been closed and destroy the + * wlr_layer_surface_v1, rendering the resource inert. */ -void wlr_layer_surface_v1_close(struct wlr_layer_surface_v1 *surface); +void wlr_layer_surface_v1_destroy(struct wlr_layer_surface_v1 *surface); bool wlr_surface_is_layer_surface(struct wlr_surface *surface); diff --git a/types/wlr_layer_shell_v1.c b/types/wlr_layer_shell_v1.c index f3986a0d..46aeaac5 100644 --- a/types/wlr_layer_shell_v1.c +++ b/types/wlr_layer_shell_v1.c @@ -60,7 +60,7 @@ static void layer_surface_handle_ack_configure(struct wl_client *client, struct wl_resource *resource, uint32_t serial) { struct wlr_layer_surface_v1 *surface = layer_surface_from_resource(resource); - if (!surface || surface->closed) { + if (!surface) { return; } @@ -302,15 +302,9 @@ void wlr_layer_surface_v1_configure(struct wlr_layer_surface_v1 *surface, } } -void wlr_layer_surface_v1_close(struct wlr_layer_surface_v1 *surface) { - if (surface->closed) { - return; - } - surface->closed = true; - if (surface->mapped) { - layer_surface_unmap(surface); - } +void wlr_layer_surface_v1_destroy(struct wlr_layer_surface_v1 *surface) { zwlr_layer_surface_v1_send_closed(surface->resource); + layer_surface_destroy(surface); } static void layer_surface_role_commit(struct wlr_surface *wlr_surface) { @@ -340,11 +334,6 @@ static void layer_surface_role_commit(struct wlr_surface *wlr_surface) { return; } - if (surface->closed) { - // Ignore commits after the compositor has closed it - return; - } - if (surface->acked_configure) { struct wlr_layer_surface_v1_configure *configure = surface->acked_configure; @@ -374,12 +363,14 @@ static void layer_surface_role_commit(struct wlr_surface *wlr_surface) { if (!surface->added) { surface->added = true; - wlr_signal_emit_safe(&surface->shell->events.new_surface, - surface); - // either the compositor found a suitable output or it must - // have closed the surface - assert(surface->output || surface->closed); + assert(!surface->configured); + assert(!surface->mapped); + wlr_signal_emit_safe(&surface->shell->events.new_surface, surface); + // Return early here as the compositor may have closed this layer surface + // in response to the new_surface event. + return; } + if (surface->configured && wlr_surface_has_buffer(surface->surface) && !surface->mapped) { surface->mapped = true;