feat(terminal): bring PageList to full parity with Ghostty

Second pass over the page memory model (done by Codex/gpt-6-astra in an
isolated worktree, reviewed and merged here):
- Resize/reflow now port Zig's incremental ReflowCursor algorithm with
  page backfill and the same capacity growth/split sequence, instead of
  rebuilding a snapshot, so page boundaries, pruning and tracked-pin
  remapping match Ghostty.
- Point<->pin conversion for the active area starts at the list tail and
  the viewport offset is cached, so hot-path operations no longer walk
  the whole scrollback from the head.
- RefCountedSet reproduces Zig's observable ID reuse and error points.
- All 202 PageList tests are ported (plus 13 extra regressions).

With this, the five Screen/Terminal tests previously ignored as blocked
on PageList behaviour pass and are re-enabled.

Test Plan:
- cargo test -p ghostty-terminal (913 passed, 0 ignored)
- cargo clippy -p ghostty-terminal --all-targets -- -D warnings
This commit is contained in:
ddidderr committed 2026-10-11 22:41:14 +02:00
1 parent d24b40cf2b
commit 83c10debe6
9 files changed
+4613 -1770

No files matched your search

@@ -432,7 +432,6 @@ fn terminal_index_bottom_of_scroll_region_with_hyperlinks() {
}
#[test]
#[ignore = "pagelist: erase_row_bounded leaves the row hyperlink flag set on the blanked row"]
fn terminal_index_bottom_of_scroll_region_clear_hyperlinks() {
let mut t = init_scrollback(5, 5, 0);
t.set_top_and_bottom_margin(2, 3);
@@ -444,7 +444,6 @@ fn terminal_resize_with_wraparound_off() {
}
#[test]
#[ignore = "pagelist: reflow less cols leaves the active area one row too low (screen has '01\n23' but active/viewport shows '23'); see pagelist-requests"]
fn terminal_resize_with_wraparound_on() {
let mut t = init(4, 2);