From 5fd5d6434e9ebbc453dde33bf58fea931ea2975a Mon Sep 17 00:00:00 2001 From: Kirill Primak Date: Fri, 24 Sep 2021 18:07:37 +0300 Subject: [PATCH] layer-shell: fix commit handler This commit makes sure the extents are kept up-to-date, fixes not damaging the surface if its layer shell-specific state didn't change, and adds a check if the layer shell-specific state didn't change but the surface got mapped/unmapped, which could affect keyboard focus. --- include/sway/layers.h | 1 + sway/desktop/layer_shell.c | 33 ++++++++++++++++++--------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/include/sway/layers.h b/include/sway/layers.h index 3c33c748a..224dc5e68 100644 --- a/include/sway/layers.h +++ b/include/sway/layers.h @@ -22,6 +22,7 @@ struct sway_layer_surface { struct wl_listener new_subsurface; struct wlr_box geo; + bool mapped; struct wlr_box extent; enum zwlr_layer_shell_v1_layer layer; }; diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c index 2b4b20276..7b249be34 100644 --- a/sway/desktop/layer_shell.c +++ b/sway/desktop/layer_shell.c @@ -168,9 +168,6 @@ static void arrange_layer(struct sway_output *output, struct wl_list *list, } // Apply sway_layer->geo = box; - wlr_surface_get_extends(layer->surface, &sway_layer->extent); - sway_layer->extent.x += box.x; - sway_layer->extent.y += box.y; apply_exclusive(usable_area, state->anchor, state->exclusive_zone, state->margin.top, state->margin.right, state->margin.bottom, state->margin.left); @@ -297,24 +294,30 @@ static void handle_surface_commit(struct wl_listener *listener, void *data) { if (wlr_output == NULL) { return; } - if (layer_surface->current.committed == 0) { - // The layer surface state didn't change - return; - } struct sway_output *output = wlr_output->data; struct wlr_box old_extent = layer->extent; - arrange_layers(output); + + bool layer_changed = false; + if (layer_surface->current.committed != 0 + || layer->mapped != layer_surface->mapped) { + layer->mapped = layer_surface->mapped; + layer_changed = layer->layer != layer_surface->current.layer; + if (layer_changed) { + wl_list_remove(&layer->link); + wl_list_insert(&output->layers[layer_surface->current.layer], + &layer->link); + layer->layer = layer_surface->current.layer; + } + arrange_layers(output); + } + + wlr_surface_get_extends(layer_surface->surface, &layer->extent); + layer->extent.x += layer->geo.x; + layer->extent.y += layer->geo.y; bool extent_changed = memcmp(&old_extent, &layer->extent, sizeof(struct wlr_box)) != 0; - bool layer_changed = layer->layer != layer_surface->current.layer; - if (layer_changed) { - wl_list_remove(&layer->link); - wl_list_insert(&output->layers[layer_surface->current.layer], - &layer->link); - layer->layer = layer_surface->current.layer; - } if (extent_changed || layer_changed) { output_damage_box(output, &old_extent); output_damage_surface(output, layer->geo.x, layer->geo.y,