summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Robatsch <raphael-git@tapesoftware.net>2021-11-06 19:51:17 +0100
committerLeonardo Hernández Hernández <leohdz172@protonmail.com>2022-03-31 15:27:13 -0600
commit79b7e755b010fc1486a89a46251a404cb97a341a (patch)
treec9cef2995e30dfa4b80f7fc83bdbdc324243f334
parentb424602ebc2dc26a3c974ee2a87ab745821491b6 (diff)
Layer shell: Prevent infinte configure/commit loop
Check the wlr_layer_surface_v1_state.committed bitmask to see if we need to rearrange. This is also what sway does. Without this check, every commit request (even if only the attached buffer changed) will lead to another configure event, which will lead to another commit, etc. This loop results in swaybg consuming 100% CPU. Co-authored-by: Owen Rafferty <owen@owenrafferty.com>
-rw-r--r--dwl.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/dwl.c b/dwl.c
index a3b33aa..bc74c96 100644
--- a/dwl.c
+++ b/dwl.c
@@ -140,6 +140,7 @@ typedef struct {
typedef struct {
/* Must be first */
unsigned int type; /* LayerShell */
+ int mapped;
struct wlr_scene_node *scene;
struct wl_list link;
struct wlr_layer_surface_v1 *layer_surface;
@@ -758,6 +759,12 @@ commitlayersurfacenotify(struct wl_listener *listener, void *data)
if (!wlr_output || !(m = wlr_output->data))
return;
+ if (wlr_layer_surface->current.committed == 0
+ && layersurface->mapped == wlr_layer_surface->mapped)
+ return;
+
+ layersurface->mapped = wlr_layer_surface->mapped;
+
if (layers[wlr_layer_surface->current.layer] != layersurface->scene) {
wl_list_remove(&layersurface->link);
wl_list_insert(&m->layers[wlr_layer_surface->current.layer],