Japanese IMEs convert one clause at a time, but the terminal's preedit overlay
painted the whole composition uniformly, so the clause the candidate window
targets was invisible. Read the IME's selection from xterm's textarea on the
insertCompositionText input event (Chromium only updates it there) and paint
that range of the preedit in the theme's selection colors. Cell-grid advance
corrections are unchanged and nothing reaches the PTY; a collapsed caret or a
range outside the preedit highlights nothing.
Fixes#27873
Co-authored-by: Neil <neil@stably.ai>
xterm's touch inertia gesture events carry no clientX/clientY, so with a
TUI requesting wheel reports a flick sent `ESC[<65;NaN;NaNM` to the PTY
(#20983). NaN slipped past `col < 0 || col >= cols`; the patched range
check in MouseService._triggerMouseEvent is negated so it fails closed.
Regenerate the beta.304 bundle and lock hash.
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
* fix: render Kitty Unicode placeholder images with bounded ownership
* Make image repaint checks independent of display profile and shell output
* Capture repaint diagnostics only after the pixel assertion fails
* fix(terminal): keep the text of an IME key pressed before a commit finalizes
A Process (229) keydown that lands after compositionend but before xterm's deferred
finalizer runs took the composing early return and never recorded that it owed its
own commit. When the finalizer ran first, the key's insertText found no pending
transaction and no owed commit, so xterm dropped it: `你` then `,` reached the PTY
as `你`.
Record the debt for such a keydown when the ended session's commit is already in the
textarea, and clear it when the pending transaction settles the text itself. Sessions
still waiting for their post-composition echo keep their old path, so the echo cannot
be sent twice.
Fixes the intermittent terminal-linux-direct-ime-commit e2e failure.
* fix(terminal): keep a commit when Escape or a keypress follows compositionend
A plain Escape after compositionend cancelled the accepted commit, dropping both the
text and the Escape; it now settles the commit and then sends Escape. The Escape that
itself ends a session (still composing, reported after compositionend) still cancels.
A keypress for the Process key that owes a commit now clears that debt, so a later
input cannot send the key's text a second time.
* chore: upgrade terminal dependencies to the matching payload betas
* test: harden xterm payload contract, align mobile pins, fix serialize-at-ref across version bumps
- Cover foreign-payload replacement and the shared blank-cell reset in the
installed image payload contract (both mutants previously survived).
- Bump mobile's xterm, webgl and unicode11 pins to the root's betas.
- Resolve the ref's own serialize version and patch so the differential
fuzz baseline builds across a version bump.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>