Touch-first live-card drawer route: source and headless proof
The opt-in compositor route SWAY_K230_CARD_TOUCH_FIRST=1 hides the legacy
Cards/Back/Previous/Next/Close controls. The existing live scene-surface mirrors,
bilinear scaling, card tap-to-expand, upward graceful-close request, privacy
placeholders, and bottom application-to-deck gesture remain in Sway. In the deck,
a single upward swipe starting in the footer launches the absolute executable
named by SWAY_K230_CARD_DRAWER_HELPER with fixed arguments --surface drawer.
No shell parses the path or arguments. If the helper cannot be spawned, the deck
remains usable. Sway’s ignored SIGCHLD disposition reaps an exited helper.
The k230-shell-drawer layer-shell namespace may map above the live deck without
tearing down its mirrors. While mapped, new card touches are gated and an existing
card gesture is cancelled/drained. Drawer cancel only unmaps, revealing the deck;
an app selection must unmap, invoke swaymsg card_shell back, then launch/focus
the chosen app. The legacy k230-launcher route still returns to normal mode.
The integrated session must start the persistent launcher separately and set
the helper to its installed trusted wrapper; this source checkpoint does not
provide that session wiring.
Cross-build from source commit f9f6515f58896fd3cf74d9a4b02f9812c233ba2e:
nix build .#card-shell --max-jobs 1 --cores 4 --no-link --print-out-paths
# /nix/store/sigvlj7s8g9rfxzh1xgj2smrpjhp1swz-k230-card-shell
The first build after adding the Meson source line failed at patch application
because its added-line count was stale; bb6d54cd corrected the hunk. The
final command above passed. Narrow host checks passed:
python3 tests/test_card_shell_chrome.py
python3 tests/test_card_shell_route.py
The headless QEMU test runs the cross-built RISC-V Sway with live Wayland client
surfaces. It compiles a host zwlr_layer_shell_v1 fixture from the pinned wlroots
protocol, maps an opaque magenta k230-shell-drawer overlay, captures the output,
checks that its pixels are above the card deck, verifies card input is gated while
mapped and resumes after unmap, and checks the helper’s fixed arguments and
normal focus restoration. It passed:
python3 tests/test_card_shell_touch_first_runtime.py
The old build without scene-order correction failed the mapped-pixel assertion; the corrected package above passed it. Existing headless composition, gestures, and recovery suites passed against the preceding build of the same route (before the scene-order correction). Input is injected by the test IPC route, and the layer fixture is not the production launcher. This evidence does not establish physical touch behavior, panel visual quality, on-board cost, production helper acknowledgment, or an installed integrated image. Card task 4.2 and the physical acceptance gates remain open. The actual board profile still attributes about 97.5% of repaint CPU to scene build and showed the opt-in scaled-pixel cache worsening paired CPU results; no performance improvement is claimed here.