Two issues from visual validation now that arrow keys work:
1. Far too slow. The `Decorations` arm called `self.reshape()`
(set_rich_text + shape_until_scroll — a full text re-shape) on
*every* decoration change. B1's own-window `CurrentLine` decoration
changes on every up/down move, so each vertical cursor step forced a
full re-shape. But only diagnostic decorations affect the rich text
(they override glyph fg in `projected_rich_chunks`); Selection /
CurrentLine / search are background quads rebuilt cheaply in
`render()`. Now reshape runs only when the fg-affecting set changed
(`fg_decoration_fingerprint` compares before/after); a
background-only change just requests a redraw.
2. The entire line looked selected. The own-window `CurrentLine` wash
paints the whole cursor line, which reads as a persistent selection
— unwanted as default. The caret already marks the own cursor, so
`collect_own_decoration_rects` now skips `CurrentLine` (renders only
own `Selection`). Revises Q#B4: the caret is the own-cursor
indicator, not a line wash. Peer presence still shows other
frontends' lines.
Test `fg_fingerprint_ignores_background_decoration_changes`: a
CurrentLine-only change leaves the fingerprint equal (no reshape); a
diagnostic change alters it (reshape).
Gates green: fmt; clippy --all-targets --workspace -D warnings;
pmacs-gpu unit 19 (+1). pmacs lib / daemon untouched.
Deferred (noted for follow-up sessions, not B1):
- Mouse click → cursor: needs the Q#B5 wire decision (no
FrontendEvent::SetCursor variant; semantic frontends can't use
grid-cell Mouse coords). Its own session.
- PageUp/PageDown: keys are forwarded and move the daemon cursor, but
pmacs-gpu renders from the top with no scroll, so the caret would
leave the viewport. Needs GPU scrolling first.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>