From f60e21ec187fc1357f78b2e91999d28fbca6d2e1 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 10 Dec 2021 04:23:21 -0500 Subject: ensure that diffing a screen against itself always returns nothing --- CHANGELOG.md | 5 +++++ src/grid.rs | 3 +++ src/row.rs | 2 ++ src/screen.rs | 1 + tests/helpers/mod.rs | 2 ++ 5 files changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a375680..e2c7a96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ * `Screen::errors` to track the number of parsing errors seen so far +### Fixed + +* No longer generate spurious diffs in some cases where the cursor is past the + end of a row + ## [0.14.0] - 2021-12-06 ### Changed diff --git a/src/grid.rs b/src/grid.rs index 9681638..a36491b 100644 --- a/src/grid.rs +++ b/src/grid.rs @@ -250,6 +250,7 @@ impl Grid { ) -> crate::attrs::Attrs { let mut prev_pos = prev.pos; let mut wrapping = false; + let mut prev_wrapping = false; for (i, (row, prev_row)) in self.visible_rows().zip(prev.visible_rows()).enumerate() { @@ -261,12 +262,14 @@ impl Grid { self.size.cols, i, wrapping, + prev_wrapping, prev_pos, prev_attrs, ); prev_pos = new_pos; prev_attrs = new_attrs; wrapping = row.wrapped(); + prev_wrapping = prev_row.wrapped(); } self.write_cursor_position_formatted( diff --git a/src/row.rs b/src/row.rs index f1c3086..d60d48b 100644 --- a/src/row.rs +++ b/src/row.rs @@ -286,6 +286,7 @@ impl Row { width: u16, row: u16, wrapping: bool, + prev_wrapping: bool, mut prev_pos: crate::grid::Pos, mut prev_attrs: crate::attrs::Attrs, ) -> (crate::grid::Pos, crate::attrs::Attrs) { @@ -294,6 +295,7 @@ impl Row { let first_cell = self.get(start).unwrap(); let prev_first_cell = prev.get(start).unwrap(); if wrapping + && !prev_wrapping && first_cell == prev_first_cell && prev_pos.row + 1 == row && prev_pos.col diff --git a/src/screen.rs b/src/screen.rs index cec1888..c885242 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -368,6 +368,7 @@ impl Screen { width, i, false, + false, crate::grid::Pos { row: i, col: start }, crate::attrs::Attrs::default(), ); diff --git a/tests/helpers/mod.rs b/tests/helpers/mod.rs index a7eaadc..53e4f42 100644 --- a/tests/helpers/mod.rs +++ b/tests/helpers/mod.rs @@ -84,6 +84,8 @@ pub fn compare_screens( Bytes(&expected.contents_diff(vt100::Parser::default().screen())) ); + is!(Bytes(&got.contents_diff(got)), Bytes(b"")); + for row in 0..rows { for col in 0..cols { let expected_cell = expected.cell(row, col); -- cgit v1.2.3-54-g00ecf