Conversation
- CHANGELOG 0.1.35: add macOS universal build, perf/size pass, and the VS 2026 Windows build fix alongside the existing entries - roadmap: bump to 0.1.35, move path jump / universal build / perf pass to Shipped, refresh Top 3 (K8s panel shipped in 0.1.34 — replaced by Docker panel completion) - wiki: Getting Started points at the universal DMG (Apple Silicon + Intel); SFTP guide documents the Go-to-path breadcrumb editor
Wheel up/down were reported with button codes 68/69 (flag 64 added to the X11 button number instead of its low two bits), which no application recognizes — mouse-wheel scrolling was dead inside every mouse-aware TUI (claude CLI, htop, vim mouse=a, lazygit, tmux with mouse on). Wheel buttons are now encoded as 64-67 per the xterm spec. Normal/UTF report mode also added an extra +1 to the row byte, placing every mouse event one row below the pointer. Closes #65
Buffer.writeChar wrote every codepoint into its own cell, including zero-width combining marks — decomposed (NFD) Vietnamese text (macOS ls filenames, output of many tools) rendered with one displaced cell per diacritic and a wrong cursor column. A zero-width mark is now canonically composed (NFC, via unorm_dart) with the codepoint in the preceding cell when a precomposed form exists; every Vietnamese letter has one, so Vietnamese NFD coverage is complete. The base cell's style is preserved and wide-char continuation cells are skipped. Marks with no precomposed form keep the legacy own-cell behavior (the cell model stores a single codepoint). Closes #67
Shift+PageUp / Shift+PageDown page through the scrollback locally (standard terminal-emulator behavior); only in the main buffer, so alternate-screen apps still receive the keys. Terminal.recoverFromStuckState() is the local equivalent of reset for a full-screen app that died uncleanly (crash, kill -9, dropped SSH connection) and left the session trapped in the alternate screen with mouse reporting on — wheel scrolling appeared completely dead at a prompt. Wired to a new right-click 'Reset Terminal' menu item.
Rendering painted every visible cell as its own Paragraph every frame (~10k drawParagraph calls for a 50x180 viewport) and re-ran keyword regexes per frame. Visible lines are now painted via cached per-line recorded Pictures keyed by a new monotonic BufferLine.version, so scrolling and steady output replay O(visible lines) pictures instead: ~7x less per-frame paint work in the included benchmark, with keyword highlights baked into the cached picture (regex runs on line change only). The LRU cache (1024 entries) is invalidated on textStyle/textScaler/theme/font/keyword-rule changes; pixel equivalence with the direct path is covered by tests. Scrollback trim compensation: once the buffer reaches maxLines, each new line trims one from the top while the pixel offset stayed put, so the content a scrolled-up reader was viewing streamed past uncontrollably. The circular buffer now exposes a monotonic droppedLines counter and RenderTerminal shifts the offset by the trimmed amount each layout (clamped at 0; re-baselined on main/alt buffer switches). Closes #66
…icode fix(terminal): wheel scrolling in TUIs, NFD Vietnamese rendering, scrollback stability + render perf
- version: 0.1.35+1 -> 0.1.36+1 - CHANGELOG: [Unreleased] -> 0.1.36 (2026-06-12); add the missing 0.1.33-0.1.36 comparison links - roadmap: bump to 0.1.36, add the terminal scroll & rendering overhaul to Shipped (wheel in TUIs, NFD Vietnamese, scrollback stability, render cache, paging keys, Reset Terminal) - wiki: Terminal guide gains a Scrolling section (wheel behavior in full-screen apps, Shift+PageUp/PageDown, Reset Terminal recovery)
wcwidth is 0 for NUL as well as combining marks, and a NUL continuation cell is written after every wide (CJK) character — each one paid for a string allocation plus an unorm.nfc() call on the hottest write path. Guard the composition attempt with codePoint >= 0x0300 (canonical combining marks all live there), so CJK streams skip it entirely. Found by post-release code review of #68.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Releases 0.1.36: fixes mouse-wheel scrolling inside mouse-aware TUIs (claude CLI, htop, vim, tmux), decomposed (NFD) Vietnamese text rendering, and scrollback drift at the buffer cap; adds a per-line picture render cache (~7× less per-frame paint work), Shift+PageUp/PageDown scrollback paging, and a right-click Reset Terminal recovery action.
Changes
lsfilenames) renders correctly ([Bug] Decomposed (NFD) Vietnamese text renders with displaced diacritics #67)maxLinescap ([Bug] Scrollback position drifts away while reading once the buffer is full #66)BufferLine.version(0.99 → 0.13 ms/frame for a 50×180 viewport); keyword-highlight regexes run on line change, not per frameType of change
release— version release tomasterHow was this tested?
cd app && flutter analyze— no new warningscd app && flutter test— 1371 tests pass (20 new: mouse-report encoding, NFC/NFD composition, scroll behavior, picture-cache pixel equivalence)claude --resume, NFD filenames vials,seq 1 500scrollback, Shift+PageUp, Reset Terminal)Checklist
Required when targeting
master(release PRs)CHANGELOG.mdupdated —[Unreleased]moved to[0.1.36], comparison links updated (added missing 0.1.33–0.1.36 links)app/pubspec.yaml(0.1.36+1)CLAUDE.mdupdated (xterm fork patch notes)docs/roadmap.mdupdated (0.1.36 shipped section)docs/wiki/User-Guide-Terminal.md— Scrolling section)