From e5bdee42da0cf6f74db46fca4bcc6c6a32c7a639 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Wed, 8 Mar 2023 21:21:24 -0500 Subject: allow getting a mutable screen, and move some operations there --- CHANGELOG.md | 8 ++++++++ src/parser.rs | 27 +++++++-------------------- src/screen.rs | 21 ++++++++++++++++----- tests/basic.rs | 18 +++++++++--------- tests/scroll.rs | 20 ++++++++++---------- 5 files changed, 50 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0047edb..51a7f97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [Unreleased] + +### Changed + +* `Parser::set_size` and `Parser::set_scrollback` have been moved to methods + on `Screen`, and `Parser::screen_mut` was added to get a mutable reference + to the screen. + ## [0.15.2] - 2023-02-05 ### Changed diff --git a/src/parser.rs b/src/parser.rs index 26431ac..673e0d9 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -27,32 +27,19 @@ impl Parser { } } - /// Resizes the terminal. - pub fn set_size(&mut self, rows: u16, cols: u16) { - self.screen.set_size(rows, cols); - } - - /// Scrolls to the given position in the scrollback. - /// - /// This position indicates the offset from the top of the screen, and - /// should be `0` to put the normal screen in view. - /// - /// This affects the return values of methods called on `parser.screen()`: - /// for instance, `parser.screen().cell(0, 0)` will return the top left - /// corner of the screen after taking the scrollback offset into account. - /// It does not affect `parser.process()` at all. - /// - /// The value given will be clamped to the actual size of the scrollback. - pub fn set_scrollback(&mut self, rows: usize) { - self.screen.set_scrollback(rows); - } - /// Returns a reference to a `Screen` object containing the terminal /// state. #[must_use] pub fn screen(&self) -> &crate::screen::Screen { &self.screen } + + /// Returns a mutable reference to a `Screen` object containing the + /// terminal state. + #[must_use] + pub fn screen_mut(&mut self) -> &mut crate::screen::Screen { + &mut self.screen + } } impl Default for Parser { diff --git a/src/screen.rs b/src/screen.rs index a50671f..cc89c20 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -110,7 +110,8 @@ impl Screen { } } - pub(crate) fn set_size(&mut self, rows: u16, cols: u16) { + /// Resizes the terminal. + pub fn set_size(&mut self, rows: u16, cols: u16) { self.grid.set_size(crate::grid::Size { rows, cols }); self.alternate_grid .set_size(crate::grid::Size { rows, cols }); @@ -125,6 +126,20 @@ impl Screen { (size.rows, size.cols) } + /// Scrolls to the given position in the scrollback. + /// + /// This position indicates the offset from the top of the screen, and + /// should be `0` to put the normal screen in view. + /// + /// This affects the return values of methods called on the screen: for + /// instance, `screen.cell(0, 0)` will return the top left corner of the + /// screen after taking the scrollback offset into account. + /// + /// The value given will be clamped to the actual size of the scrollback. + pub fn set_scrollback(&mut self, rows: usize) { + self.grid_mut().set_scrollback(rows); + } + /// Returns the current position in the scrollback. /// /// This position indicates the offset from the top of the screen, and is @@ -134,10 +149,6 @@ impl Screen { self.grid().scrollback() } - pub(crate) fn set_scrollback(&mut self, rows: usize) { - self.grid_mut().set_scrollback(rows); - } - /// Returns the text contents of the terminal. /// /// This will not include any formatting information, and will be in plain diff --git a/tests/basic.rs b/tests/basic.rs index 477154b..3424578 100644 --- a/tests/basic.rs +++ b/tests/basic.rs @@ -18,18 +18,18 @@ fn set_size() { assert_eq!(parser.screen().size(), (24, 80)); assert_eq!(parser.screen().cursor_position(), (0, 0)); - parser.set_size(34, 8); + parser.screen_mut().set_size(34, 8); assert_eq!(parser.screen().size(), (34, 8)); assert_eq!(parser.screen().cursor_position(), (0, 0)); parser.process(b"\x1b[30;5H"); assert_eq!(parser.screen().cursor_position(), (29, 4)); - parser.set_size(24, 80); + parser.screen_mut().set_size(24, 80); assert_eq!(parser.screen().size(), (24, 80)); assert_eq!(parser.screen().cursor_position(), (23, 4)); - parser.set_size(34, 8); + parser.screen_mut().set_size(34, 8); assert_eq!(parser.screen().size(), (34, 8)); assert_eq!(parser.screen().cursor_position(), (23, 4)); @@ -37,7 +37,7 @@ fn set_size() { assert_eq!(parser.screen().size(), (34, 8)); assert_eq!(parser.screen().cursor_position(), (0, 0)); - parser.set_size(24, 80); + parser.screen_mut().set_size(24, 80); assert_eq!(parser.screen().size(), (24, 80)); assert_eq!(parser.screen().cursor_position(), (0, 0)); @@ -45,26 +45,26 @@ fn set_size() { assert_eq!(parser.screen().size(), (24, 80)); assert_eq!(parser.screen().cursor_position(), (23, 4)); - parser.set_size(34, 8); + parser.screen_mut().set_size(34, 8); parser.process(b"\x1bc01234567890123456789"); assert_eq!(parser.screen().contents(), "01234567890123456789"); - parser.set_size(24, 80); + parser.screen_mut().set_size(24, 80); assert_eq!(parser.screen().contents(), "01234567\n89012345\n6789"); - parser.set_size(34, 8); + parser.screen_mut().set_size(34, 8); assert_eq!(parser.screen().contents(), "01234567\n89012345\n6789"); let mut parser = vt100::Parser::default(); assert_eq!(parser.screen().size(), (24, 80)); - parser.set_size(30, 100); + parser.screen_mut().set_size(30, 100); assert_eq!(parser.screen().size(), (30, 100)); parser.process(b"\x1b[75Cfoobar"); assert_eq!(parser.screen().contents(), " foobar"); let mut parser = vt100::Parser::default(); assert_eq!(parser.screen().size(), (24, 80)); - parser.set_size(30, 100); + parser.screen_mut().set_size(30, 100); assert_eq!(parser.screen().size(), (30, 100)); parser.process(b"1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\x1b[24;99Hfoobar"); assert_eq!(parser.screen().contents(), "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24 foobar"); diff --git a/tests/scroll.rs b/tests/scroll.rs index 21e0ae6..16bd42c 100644 --- a/tests/scroll.rs +++ b/tests/scroll.rs @@ -20,31 +20,31 @@ fn scrollback() { parser.process(b"\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30"); assert_eq!(parser.screen().contents(), "7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30"); - parser.set_scrollback(0); + parser.screen_mut().set_scrollback(0); assert_eq!(parser.screen().scrollback(), 0); assert_eq!(parser.screen().contents(), "7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30"); - parser.set_scrollback(1); + parser.screen_mut().set_scrollback(1); assert_eq!(parser.screen().scrollback(), 1); assert_eq!(parser.screen().contents(), "6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29"); - parser.set_scrollback(3); + parser.screen_mut().set_scrollback(3); assert_eq!(parser.screen().scrollback(), 3); assert_eq!(parser.screen().contents(), "4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27"); - parser.set_scrollback(6); + parser.screen_mut().set_scrollback(6); assert_eq!(parser.screen().scrollback(), 6); assert_eq!(parser.screen().contents(), "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24"); - parser.set_scrollback(7); + parser.screen_mut().set_scrollback(7); assert_eq!(parser.screen().scrollback(), 6); assert_eq!(parser.screen().contents(), "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24"); - parser.set_scrollback(0); + parser.screen_mut().set_scrollback(0); assert_eq!(parser.screen().scrollback(), 0); assert_eq!(parser.screen().contents(), "7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30"); - parser.set_scrollback(7); + parser.screen_mut().set_scrollback(7); assert_eq!(parser.screen().scrollback(), 6); assert_eq!(parser.screen().contents(), "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24"); @@ -72,11 +72,11 @@ fn scrollback() { assert_eq!(parser.screen().scrollback(), 10); assert_eq!(parser.screen().contents(), "3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26"); - parser.set_scrollback(12); + parser.screen_mut().set_scrollback(12); assert_eq!(parser.screen().scrollback(), 10); assert_eq!(parser.screen().contents(), "3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26"); - parser.set_scrollback(0); + parser.screen_mut().set_scrollback(0); assert_eq!(parser.screen().scrollback(), 0); assert_eq!(parser.screen().contents(), "13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36"); @@ -84,7 +84,7 @@ fn scrollback() { assert_eq!(parser.screen().scrollback(), 0); assert_eq!(parser.screen().contents(), "15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38"); - parser.set_scrollback(5); + parser.screen_mut().set_scrollback(5); assert_eq!(parser.screen().scrollback(), 5); assert_eq!(parser.screen().contents(), "10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33"); -- cgit v1.2.3-54-g00ecf