Every tab is maximized and kick draws no frames, so new toplevels
are pinned to client-side mode (headerbars keep working) and later
server-side requests are ignored. Pinning happens at map -- set_mode
asserts on a never-committed surface, and decoration-before-commit is
the normal order (calling it in new_toplevel_decoration aborts
wlroots); late binds pin immediately when already initialized.
Adds an xdeco probe (maps one shm-backed toplevel, reports the
configured mode) with a regression test asserting mode=1, tracks it
in build.sh staleness, and covers the global in protocol_globals.
Full suite: 153 passed, 2 skipped.
./build.sh release builds into build-release/ with --buildtype=release
and strips the binary in place (meson's strip only applies on install),
yielding a ~270KB binary for size benchmarking against distro
compositors like labwc. The default ./build.sh debug path and the
build/ tree used by the test suite are untouched.
meson setup --reconfigure touches subprojects/.wraplock every run,
making it newer than build/kick and triggering an infinite rebuild
loop. The file is meson housekeeping, not a real source dependency.
Running pytest against a stale build/ binary silently proved nothing:
test.sh and test-headless.sh now run build.sh first, and build.sh
skips meson setup/compile when both binaries are newer than their
sources (tracked per program: kick.c feeds kick, tests/wltest.c feeds
wltest, meson.build and subprojects feed both).