diff options
| author | user <user@clank> | 2026-08-13 19:39:18 +0200 |
|---|---|---|
| committer | user <user@clank> | 2026-08-13 19:39:18 +0200 |
| commit | ae726b5bb3ff8e9e8f2bef0e9fbc9d4dcb62a79e (patch) | |
| tree | a6cc3f56559c05b812d6bf6998d2b768c8672162 /docs/roadmap.md | |
| parent | build: cut the edit loop from 52s to 5s with more codegen units (diff) | |
| download | sl0ppi-ae726b5bb3ff8e9e8f2bef0e9fbc9d4dcb62a79e.tar.gz sl0ppi-ae726b5bb3ff8e9e8f2bef0e9fbc9d4dcb62a79e.tar.xz sl0ppi-ae726b5bb3ff8e9e8f2bef0e9fbc9d4dcb62a79e.zip | |
sl0p: make the split button work on stacked panes too
Reported still dead on a live session after the previous fix. Stacks move the
frame twice more, and neither move was in the hit-test:
- a stack list is drawn over the top rows of its visible member, pushing that
pane's frame down. The renderer applies this as a frame geom override
(reserved_top_rows); the click side did not, so every pane in a stack was
clickable one row above its own title. frame_rect_with_top_reserved() now
applies the same shift, before the gap inset, in the same order as render;
- a stack's collapsed members drew a button on their one-row title. Nothing
could honour it -- that row is the stack's picker, and "split the pane that
is not on screen" is not a thing to ask anyway. They no longer draw one, and
the click side mirrors the condition. 120 snapshot lines change, every one
of them a one-liner losing its button and nothing else (same width, same
content otherwise; audited mechanically).
Both confirmed by reintroducing each bug and watching the check fail. A third
candidate fix -- resolving a click to the stack's visible member, on the theory
that get_pane_at could return a collapsed sibling -- turned out to be
unnecessary: collapsed members have one-row geoms, so position lookup already
lands on the right pane. Removed rather than kept "just in case".
The check itself was wrong twice before it was right, in the direction that
matters most (reporting failures that were its own): it now reads until the pty
goes quiet instead of for a fixed time, and parses only a freshly forced
repaint, so a half-arrived screen cannot look like a button drawn where it is
not. It clicks every button it can see, and runs against config/config.kdl as
well, whose stacks the minimal config never had.
When the two disagree, the server's own log settles it: log::info! in
intercept_split_button_click, read /tmp/sl0ppij-$UID/sl0ppij-log/.
Diffstat (limited to 'docs/roadmap.md')
| -rw-r--r-- | docs/roadmap.md | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/docs/roadmap.md b/docs/roadmap.md index cf7692c..9afed17 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -228,11 +228,15 @@ to hide it: - the title was budgeted before the button, so a title longer than the frame (i.e. any shell showing a path) consumed its columns; - the click hit-tested the pane's allocation while the frame is drawn inset by - the pane gap, putting the clickable columns two to the right of the glyph. + the pane gap, putting the clickable columns two to the right of the glyph; +- and, found after that shipped, stacks move the frame twice more: a stack list + pushes the visible member's frame down by its reserved rows, and the collapsed + members drew a button on a one-row title that nothing could ever honour. The first three are fixed in `ui/pane_boundaries_frame.rs` by reserving the anchored button before anything else and never discarding the right side; the -fourth by `Pane::frame_rect()`, the rect the frame is actually drawn in. +rest by `Pane::frame_rect_with_top_reserved()`, the rect the frame is actually +drawn in, and by not drawing a button on a stack's collapsed members. **How to re-run the check** -- unit tests were necessary and insufficient here for the fourth time, so this one reads the screen: @@ -241,10 +245,17 @@ for the fourth time, so this one reads the screen: make check-live # packaging/checks/split-button-live.py ``` -It starts a session at a pty with the live frame config, finds the `+` on the -frame, attaches a second client (the middle builder), and clicks the columns the -glyph was found in, expecting `2 -> 3` panes. Confirmed to fail on the commit -before the fix, for both the render and the click. +It starts a session at a pty, finds the `+` on the frame, attaches a second +client (the middle builder), splits and stacks, then clicks every button it can +see and expects one new pane per click. It runs twice, with a minimal config and +with `config/config.kdl` -- the real one, whose stacks are where the second +round of bugs was. Every fix was confirmed by reintroducing it and watching the +check fail. + +If it ever disagrees with the code, do not theorise about the screen: put a +`log::info!` in `intercept_split_button_click` and read +`/tmp/sl0ppij-$UID/sl0ppij-log/`. The server's own geometry settles in one run +what screen-scraping cannot. ## Standing risks |
