summaryrefslogtreecommitdiffhomepage
path: root/packages/ext-layer-shell/src/ext_layer_shell.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'packages/ext-layer-shell/src/ext_layer_shell.cpp')
-rw-r--r--packages/ext-layer-shell/src/ext_layer_shell.cpp20
1 files changed, 16 insertions, 4 deletions
diff --git a/packages/ext-layer-shell/src/ext_layer_shell.cpp b/packages/ext-layer-shell/src/ext_layer_shell.cpp
index 5670c52..3ca013d 100644
--- a/packages/ext-layer-shell/src/ext_layer_shell.cpp
+++ b/packages/ext-layer-shell/src/ext_layer_shell.cpp
@@ -397,11 +397,23 @@ LayerSurface::LayerSurface(LayerShellExt& owner, wlr_layer_surface_v1* surface,
// RAII handle is a member; it unregisters when this LayerSurface dies.
host_reg_ = owner_.host().host_surface(surface_->surface, scene_->tree);
- // Re-arrange this surface's output on every commit (covers the mandatory
- // initial-commit configure and any later anchor/zone/size change), then
- // re-evaluate keyboard focus.
+ // Re-arrange this surface's output ONLY when the arrangement could have
+ // changed: the mandatory initial-commit configure, or a commit that changed
+ // a layout-relevant field (anchor / desired size / exclusive zone / margin /
+ // layer / exclusive edge — i.e. current.committed != 0). A plain buffer or
+ // frame commit changes none of these (committed == 0, not the initial
+ // commit) and MUST NOT trigger a configure: arrange() unconditionally calls
+ // wlr_scene_layer_surface_v1_configure, and in wlroots 0.20 that emits a
+ // fresh configure event every call. Reconfiguring on every commit created a
+ // configure -> ack_configure -> apply-commit -> configure feedback loop that
+ // flooded the client's 4 KiB connection buffer ("Data too big for buffer")
+ // and got it killed mid-handshake — the intermittent "fuzzel needs several
+ // Super presses to open" bug. Keyboard focus is still re-evaluated every
+ // commit (cheap; it only acts once mapped).
commit_.connect(surface_->surface->events.commit, [this](void*) {
- owner_.arrange(surface_->output);
+ if (surface_->initial_commit || surface_->current.committed != 0) {
+ owner_.arrange(surface_->output);
+ }
update_keyboard_focus();
});