diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-07 00:04:32 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-07 00:04:32 +0300 |
| commit | a51902ede97afd84b469f838f25ab79287bd375d (patch) | |
| tree | 986cf68f33370450eae9152ac3c2015aeebe5882 /src/ghostty | |
| parent | 6ccf156a3dd23f419c03892ddc1136e72957f66a (diff) | |
fix: use byte-based pane scrollback limit
Diffstat (limited to 'src/ghostty')
| -rw-r--r-- | src/ghostty/mod.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/ghostty/mod.rs b/src/ghostty/mod.rs index e9ca1f86..297b0e6b 100644 --- a/src/ghostty/mod.rs +++ b/src/ghostty/mod.rs @@ -1115,6 +1115,19 @@ impl<'a> RowCellIter<'a> { mod tests { use super::*; + fn write_numbered_lines(terminal: &mut Terminal, count: usize) { + for i in 0..count { + terminal.write(format!("{i:06}\r\n").as_bytes()); + } + } + + fn write_padded_lines(terminal: &mut Terminal, count: usize, width: usize) { + let line = format!("{}\r\n", "x".repeat(width)); + for _ in 0..count { + terminal.write(line.as_bytes()); + } + } + #[test] fn focus_encoding_matches_expected_sequences() { assert_eq!(encode_focus(FocusEvent::Gained).unwrap(), b"\x1b[I"); @@ -1194,6 +1207,46 @@ mod tests { } #[test] + fn zero_max_scrollback_disables_history() { + let mut terminal = Terminal::new(80, 3, 0).unwrap(); + write_numbered_lines(&mut terminal, 3000); + assert_eq!(terminal.scrollback_rows().unwrap(), 0); + } + + #[test] + fn max_scrollback_limit_bytes_retains_more_history_for_larger_limits() { + let mut small = Terminal::new(80, 3, 1_000_000).unwrap(); + let mut large = Terminal::new(80, 3, 10_000_000).unwrap(); + + write_padded_lines(&mut small, 20_000, 70); + write_padded_lines(&mut large, 20_000, 70); + + let small_scrollback = small.scrollback_rows().unwrap(); + let large_scrollback = large.scrollback_rows().unwrap(); + + assert!( + large_scrollback > small_scrollback, + "expected larger byte limit to retain more history, got small={small_scrollback}, large={large_scrollback}" + ); + } + + #[test] + fn large_negative_scroll_delta_reaches_top_of_scrollback() { + let mut terminal = Terminal::new(80, 3, 1_000_000).unwrap(); + write_numbered_lines(&mut terminal, 1000); + + let before = terminal.scrollbar().unwrap(); + assert!(before.total > before.len); + + terminal.scroll_viewport_bottom(); + terminal.scroll_viewport_delta(-10_000); + + let after = terminal.scrollbar().unwrap(); + assert_eq!(after.offset, 0); + assert_eq!(after.len, before.len); + } + + #[test] fn terminal_and_render_state_smoke_test() { let mut terminal = Terminal::new(8, 3, 100).unwrap(); assert_eq!(terminal.cols().unwrap(), 8); |
