refactor(terminal): wire kitty graphics and drop PageList workarounds

Integration pass over the terminal core (Codex/gpt-6-astra, reviewed):
- Screen now owns the real kitty ImageStorage; new/reset/teardown,
  erase-display deletes and alternate-screen limit inheritance hook in
  where Zig does, and Terminal implements ExecTerminal so kitty APC
  commands execute against it. Exec tests use a real Terminal.
- The PageList gains the APIs Screen/Terminal needed (pin iterators,
  cross-page row/partial-row clone, string allocator probing, dedup
  before allocating hyperlinks, Top viewport fixup after erase, append_
  grapheme no longer marking rows dirty), and the Screen/Terminal
  workarounds for their absence are removed so the code mirrors Zig.

Public signatures are unchanged; downstream crates build as before.

Test Plan:
- cargo test -p ghostty-terminal (1252 passed, 0 ignored)
- cargo clippy -p ghostty-terminal --all-targets -- -D warnings
This commit is contained in:
ddidderr committed 2026-10-11 22:57:35 +02:00
1 parent 88cc13871c
commit 677683b740
12 files changed
+708 -476

No files matched your search

+4 -3
View File
@@ -7,7 +7,6 @@
use crate::{
page::{Cell, Error},
page_list::{Direction, PageList, Pin, TrackedPin},
pin_iter,
point::{Coordinate, Point, Tag},
};
@@ -447,7 +446,8 @@ impl Selection {
}
Adjustment::Left => {
let found = pin_iter::cell_iterator(list, end_pin, Direction::LeftUp, None)
let found = end_pin
.cell_iterator(list, Direction::LeftUp, None)
.skip(1)
.find(|p| cell_has_text(list, *p));
if let Some(next) = found {
@@ -458,7 +458,8 @@ impl Selection {
Adjustment::Right => {
// Step right, wrapping to the next row down at the start of each new line,
// until we find a non-empty cell.
let found = pin_iter::cell_iterator(list, end_pin, Direction::RightDown, None)
let found = end_pin
.cell_iterator(list, Direction::RightDown, None)
.skip(1)
.find(|p| cell_has_text(list, *p));
if let Some(next) = found {