getViewport() returns corrupted data when viewport spans multiple pages
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
Description
renderStateGetViewport in the WASM build resolves the viewport top-left position independently for each row using pages.pin(.active). When the viewport spans multiple internal pages, this per-row resolution can produce inconsistent results, leading to corrupted viewport data.
Additionally, scrollbackLimit is passed as a line count but Terminal.init() interprets max_scrollback as bytes, causing the scrollback buffer to be much smaller than intended and making the page-spanning condition occur more frequently.
Symptoms
getScrollbackLength()drops unexpectedly (e.g., 498 → 269) after repeated writesgetViewport()returns rows with content from different terminal lines merged together- Both
getViewport()andgetLine()return the same wrong data - Corruption frequency depends on column width:
- cols=80: OK
- cols=120: CORRUPT
- cols=130: CORRUPT
- cols=140: OK
- cols=160: scrollback drops but viewport may appear OK (merge lands on empty rows)
Root cause
The native Ghostty renderer reads cell data from cached row pins in RenderState.row_data (built during update()), which guarantees consistent page resolution across all viewport rows. The WASM renderStateGetViewport instead calls pages.pin(.active) per-row, which can resolve to different pages inconsistently when the viewport straddles a page boundary.
Reproduction
- Create a terminal at cols=130, rows=39, scrollback=10000
- Repeatedly write ~68 lines of escape-heavy output (SGR 256-color, truecolor, attributes)
- After ~8 repetitions, call
getScrollbackLength()andgetViewport() - Scrollback length will drop and/or viewport rows will contain merged content
Expected behavior
getViewport() should return consistent, correct row data regardless of internal page layout. scrollbackLimit should be interpreted consistently between the JS config and WASM init.
Fix
Draft PR with fix and regression tests: #133
- Lingua principale
- TypeScript
- Stelle
- 2.9k
- Fork
- 182
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di coder/ghostty-web
-
buffer translateToString()/getChars() return '' for empty cells, collapsing cursor-positioned textAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
coder/ghostty-web#205 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
coder/ghostty-web#204 ·
-
Alt+<printable key> sends the bare key with no ESC prefix (readline/emacs/tmux meta bindings lost)Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
coder/ghostty-web#203 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
coder/ghostty-web#199 ·
-
Public buffer getChars and translateToString truncate multi-codepoint graphemesForse già presa @schickling-assistant l’ha presa 11 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 76/100
coder/ghostty-web#200 ·
Tutte le issue di coder/ghostty-web
Issue simili
-
Documentation Link TypoAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 83/100
Zettlr/Zettlr#6610 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Feil lovtekst i bekreftelsen når leder melder unntak fra oppfølgingsplanForse già presa @AudunSorheim l’ha presa oggi. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 92/100
navikt/syfo-oppfolgingsplan-frontend#1110 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
db-ux-design-system/core-web#8461 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Cannot run an integration on windows when power shell is selected as the default profile terminalApertaPriority/Blocker Type/Bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
wso2/product-integrator#2767 ·
I maintainer di solito rispondono entro 1 giorno