aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsaac Freund <ifreund@ifreund.xyz>2021-08-12 21:30:58 +0200
committerSimon Ser <contact@emersion.fr>2021-08-14 20:25:46 +0200
commit3364eec07e91eb51f770f2f7d619a07d96c0b5c4 (patch)
treed2bb22d59f83b6aec145d2734999f03f4cc5cb26
parentad7651a3709f0953697e92798b8ff4ce6dd06f48 (diff)
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.
-rw-r--r--include/wlr/types/wlr_layer_shell_v1.h7
-rw-r--r--types/wlr_layer_shell_v1.c29
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;