swayfx-mosaic/tooling/probes/step20c-vertical-grab/README.md

7.6 KiB

STEP20C vertical-output nested grab fixture (EXPERIMENTAL)

This source-only fixture reuses the pinned private nested-grab build and the unchanged valid-grab patches. It does not enter the ordinary Mosaic build, production patch or package. The comparative protocol, observations and limits are in the vertical probe report.

Provenance and SHA-256

Input Role / origin SHA-256
SceneFX private patch Unchanged, SceneFX 37ccd723bef49e6891156ffafce8f549f01446cc c74c515b98da8f5f637e260e6a3755c7a75bd78d1c39e54a67850f1c383e30e7
Mosaic private patch Unchanged, Mosaic cd550382b311efdbfe3ed892f4e1d281d852e754 d416f6413ea097a48a44d231e50ffba363914f46c8687f0ea2e4dcacd5f31fe9
Hidden-owner guard Unchanged, after Mosaic private patch 35785a8f3e863b3c1fd87932d8ff0c2949b03cb04382cc34e1126170968f802b
client-vertical.patch Adds three vertical placements and a 575 px toplevel buffer to a temporary copy of the preserved nested-client.c 58e1c41cde875ebf2edf25adb0ae98c03cb33aaf26ab4088a8782880a366e837
pointer-extents.patch Adds validated WIDTH/HEIGHT arguments to a temporary copy of the preserved pointer-daemon.c 4eeb9f808d0941edca82dc3c5d24a9c936cc3d9d8bb80af3db6aed6af0d47c50
prepare.sh Reuses the earlier pinned private build, applies the two fixture patches and recompiles only the clients 6003004eaa3cbd005ca29d3e2319e1e8fe15377d4a883d352b27e289d70fbb52
run.py Isolated comparative runner, derived from preserved nested-grab runner b7dc778c01d9e8e1f058c1aa2bb0e3e0e8dfa6ad1ba8e5af122a0503cd7eef96

The patched laboratory clients have SHA-256 b2381f088994202a0577318b2da3bcf799362c6d5308be1e66a6bdd55a1fc76b (nested-client.c) and ede9a39adbe1744c771a784f6ad0c296259e36b942c78d75be620b86b9f2a66d (pointer-daemon.c). The originals and all three compositor/library patches remain byte-identical. client-vertical.patch adds v_visible, v_b_cross and v_both_cross and sets the vertical toplevel buffer height to 575 px. A's y=350/480 anchors then remain inside its effective window geometry; horizontal client behavior is unchanged. pointer-extents.patch keeps left/right button behavior and rejects invalid coordinates; the runner passes 800 1200 vertically or 1600 600 horizontally. The virtual pointer stays alive for the case. The copied runner changes output geometry, verifies IPC output rectangles/scale/transform, derives sample points from configured popup geometry and the actual wev rectangle, saves measurements.json, and records process exit statuses. It does not change production C.

The measured environment used SwayFX 0.6 (/usr/bin/sway), SceneFX 0.5, wlroots 0.20.2, Wayland client 1.26.0 and wayland-protocols 1.49. Required tools: Git, Meson, Ninja, a C17 compiler, pkg-config, wayland-scanner, Python, kitty, swaymsg, grim and wev. The prior prepare.sh fetches the pinned SceneFX commit into a disposable directory, applies its private patch first, then the Mosaic patch and hidden-owner guard, builds private SceneFX and Mosaic, generates the XDG and virtual-pointer protocols and compiles both clients. This wrapper applies the two new patches only to temporary client copies and recompiles them. No system installation occurs.

Fresh replay

Run from the root of a full Git checkout with the pinned Mosaic commit in its object database. A source-only git archive is insufficient because the reused nested-grab preparation runs git archive on that pinned commit. The build prints a real LAB= path and the private build log path. Capture that output rather than substituting a fictitious temporary directory. An unsuccessful preparation prints its log path and cleans its incomplete laboratory.

prep=$(sh tooling/probes/step20c-vertical-grab/prepare.sh)
printf '%s\n' "$prep"
LAB=$(printf '%s\n' "$prep" | sed -n 's/^LAB=//p')
test -d "$LAB"
python tooling/probes/step20c-vertical-grab/run.py "$LAB" control visible vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_standard visible vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_mosaic visible vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" control b_cross vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_standard b_cross vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_mosaic b_cross vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" control both_cross vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_standard both_cross vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_mosaic both_cross vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" control below_left vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_standard below_left vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_mosaic below_left vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" control below_a vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_standard below_a vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_mosaic below_a vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_mosaic hidden vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_mosaic hidden_click vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_mosaic toggle vertical
python tooling/probes/step20c-vertical-grab/run.py "$LAB" control b_cross horizontal
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_standard b_cross horizontal
python tooling/probes/step20c-vertical-grab/run.py "$LAB" private_mosaic b_cross horizontal

Each run creates a single-use run-GEOMETRY-CASE-SCENARIO directory in LAB. Its outputs-verified.json, IPC tree/output snapshots, measurements.json, client.log (WAYLAND_DEBUG=1), pointer.log, wev.log, compositor.log, two-output PNGs and exit-status.json are the evidence. runtime-path records a new short mode-0700 /tmp/mvg-* directory; the runner removes it after reaping only processes it started. It clears inherited WAYLAND_DISPLAY, SWAYSOCK, I3SOCK and client LD_LIBRARY_PATH; private SceneFX is loaded only by the private compositor. Every swaymsg uses the discovered socket with -s. The daily desktop is never addressed.

Verify the configured A/B XDG rectangles and matching real button serials before using any pixel comparison. A crossing estimate is insufficient: standard controls must show popup pixels on HEADLESS-2 and receive the sampled lower button. Compare Mosaic upper popup buttons, lower wev buttons, popup_done order and both PNGs. The runner can finish normally even when scientific evidence is INCONCLUSIVE; use the report criteria. One outside click may dismiss the grabbed hierarchy, so left, right and A lower tests are separate runs. The toggle case changes layout with both popups still open. Horizontal regression uses the same adapted pointer with its historical (1600,600) extents.

Cleanup

Preserve the lab until measurements and hashes have been reviewed. A normal run removes its own runtime directory. For an interrupted run, inspect its runtime-path and remove only that recorded /tmp/mvg-* directory after confirming its private processes have stopped. Then remove only the named LAB and the printed BUILD_LOG. Never remove the old historical labs or any system library. Generated sources, binaries, sockets, logs and captures stay outside Git.