pmacs/pmacs-gpu/src
Levi Neuwirth a4627cdfbb
fix(gui-1b): B5 --- re-derive the cursor icon where geometry settles
The previous commit applied the icon in the `BufferSnapshot` arm after
its reshape, and routed menu writes through a `set_menu` helper that
applied it too. Both were wrong in the same way: they patched the two
paths that had been noticed instead of the place the paths converge.

Two consequences, both found in review.

The snapshot's documented mutation did not fire. Replacing
`set_menu(None)` with `self.menu = None` still passed, because the
unconditional post-reshape apply in the same arm restored `Text`. The
two appliers masked each other, so the single-writer property was an
inspection claim wearing a witness's clothes, and the row's stated
mutation named something the row could not see.

And the snapshot is only one geometry transition. The line-number mode
moves `text_left` through its own path; minimap arrival, panel
appearance, window resize and font metrics move the text clip the same
way. A stationary pointer could go from text to gutter, minimap, panel
or outside with the icon still saying `Text`. Ten call sites reshape;
three applied the icon.

So the icon is now re-derived in `reshape`'s tail --- the one point
every geometry settle already passes through --- and the two ad-hoc
geometry appliers are gone, `set_menu` with them. Three production
appliers remain, one per cause: pointer motion, menu ownership with no
geometry, and geometry.

Each is separately witnessed; the matrix is disjoint. Dropping the
`reshape` tail fires the two snapshot rows and the new line-number row;
dropping the `MenuPrompt` applier fires the lifecycle row alone;
dropping the every-motion applier fires the motion row alone.

The new row drives `InstanceMessage::LineNumbers` --- the production
arm, not `apply_panel_cursor_icon` directly --- turning the gutter on
under a stationary pointer and asserting the pixel it swallows stops
being an I-beam. Its setup asserts the gutter actually moved past the
probe, so the row cannot pass by measuring nothing.

Gates at this tree: fmt clean; clippy --workspace --all-targets
-D warnings clean; pmacs-gpu 306 (+1); --lib 1997; --lib --features
crdt 2190; pmacs-protocol 32; git diff --check clean.
2026-09-01 14:42:26 +02:00
..
attach.rs feat(panel): the wheel exemption, exhaustion, and mapped coalescing 2026-08-20 17:55:21 +02:00
main.rs fix(gui-1b): B5 --- re-derive the cursor icon where geometry settles 2026-09-01 14:42:26 +02:00
math_layout.rs feat(math): caret-driven suppression, the draw pass, and the slice acceptance 2026-07-24 22:04:35 -04:00
math_parse.rs feat(math): caret-driven suppression, the draw pass, and the slice acceptance 2026-07-24 22:04:35 -04:00
terminal.rs feat(bottom-panel): paint and drive the GPU panel band 2026-07-29 18:40:46 -04:00