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;