multiline paste and cursor fix

This commit is contained in:
Jonas H
2026-06-16 11:45:26 +02:00
parent 10279a49a4
commit 8ffd258341
3 changed files with 105 additions and 9 deletions

View File

@@ -145,6 +145,24 @@ UI thread redraws on its own tick (no channel; just the mutex).
- Mouse is captured: wheel always scrolls the feed (regardless of focus), and
left-drag selects screen text, copied on release via OSC 52 (like Claude
Code). Native terminal selection therefore needs shift held.
- Bracketed paste is enabled on the outer terminal (`EnableBracketedPaste`):
a multiline paste arrives as one `Event::Paste` and, when the claude pane
has focus, is handed to the child via `EmbeddedTerm::paste`
(wezterm-term's `send_paste` re-wraps it in bracketed markers iff the child
enabled them) — so Claude Code inserts it as one block instead of
submitting on the first embedded newline. Paste is ignored when the pane is
unfocused (nothing else takes text input).
- Pane cursor shape mirrors the child: each frame `draw` records the child's
DECSCUSR shape (`EmbeddedTerm::cursor_shape`) into `EmbedUi::cursor_shape`
and the event loop emits `SetCursorStyle` only on change (so a blinking
cursor isn't reset every frame), resetting to `DefaultUserShape` when no
pane cursor is shown / on teardown. Without this the outer terminal kept a
stale block cursor regardless of Claude Code's insert-vs-vim-normal state.
`term::cursor_style` maps the child's DECSCUSR `Default` to a blinking *bar*,
not `DefaultUserShape`: Claude Code's normal input leaves the cursor at the
terminal default expecting a bar caret, so forwarding the outer terminal's
own default (often a block) would wrongly show a block in insert mode; vim
normal mode still sends an explicit `SteadyBlock`.
- ratatui needs feature `unstable-rendered-line-info` for `Paragraph::line_count`
(used to compute cached per-entry wrapped heights for follow/auto-scroll).
- reqwest is `default-features = false` + `rustls-tls,stream` — don't enable
@@ -170,11 +188,11 @@ UI thread redraws on its own tick (no channel; just the mutex).
- Tool results only appear once the *next* request fires; if the session ends
right after a tool call, that result is never seen. Output is what Claude
Code sends the model (i.e. post-truncation).
- Embedded pane: no bracketed paste or mouse forwarding yet; no scrollback
view (live screen only); shift+enter needs kitty keyboard protocol pushed
on the outer terminal (not done); permission prompts aren't detected for
pane growth (not visible in the API stream — would need a Notification
hook hitting a local control endpoint).
- Embedded pane: no mouse forwarding yet; no scrollback view (live screen
only); shift+enter needs kitty keyboard protocol pushed on the outer
terminal (not done); permission prompts aren't detected for pane growth
(not visible in the API stream — would need a Notification hook hitting a
local control endpoint).
- Materialized branch files satisfy our own parser (round-trip tested) but
Claude Code's loader tolerance is only verified empirically by resuming
one — if a CC update changes the JSONL schema, retest `b` + ctrl-↓. The