diff options
-rw-r--r-- | src/grid.rs | 8 | ||||
-rw-r--r-- | src/row.rs | 14 | ||||
-rw-r--r-- | tests/window_contents.rs | 9 |
3 files changed, 14 insertions, 17 deletions
diff --git a/src/grid.rs b/src/grid.rs index 0e0ff9d..075e604 100644 --- a/src/grid.rs +++ b/src/grid.rs @@ -176,12 +176,10 @@ impl Grid { let mut final_col = prev.pos.col; for (idx, (row, prev_row)) in self.rows().zip(prev.rows()).enumerate() { - let (mut new_contents, new_attrs, new_col) = row.contents_diff( - idx.try_into().unwrap(), - prev_row, - prev_attrs, - ); + let (mut new_contents, new_attrs, new_col) = + row.contents_diff(prev_row, prev_attrs); if !new_contents.is_empty() { + contents.extend(format!("\x1b[{};1H", idx + 1).as_bytes()); final_row = idx.try_into().unwrap(); final_col = new_col; } @@ -125,11 +125,10 @@ impl Row { pub fn contents_diff( &self, - row_idx: u16, prev: &Self, attrs: crate::attrs::Attrs, ) -> (Vec<u8>, crate::attrs::Attrs, u16) { - let mut needs_move = true; + let mut skip = 0; let mut contents = vec![]; let mut prev_attrs = attrs; let mut final_col = 0; @@ -137,14 +136,11 @@ impl Row { self.cells().zip(prev.cells()).enumerate() { if cell == prev_cell { - needs_move = true; + skip += 1; } else { - if needs_move { - contents.extend( - format!("\x1b[{};{}H", row_idx + 1, idx + 1) - .as_bytes(), - ); - needs_move = false; + if skip > 0 { + contents.extend(format!("\x1b[{}C", skip).as_bytes()); + skip = 0; } let attrs = cell.attrs(); diff --git a/tests/window_contents.rs b/tests/window_contents.rs index 17a54b5..1d351cb 100644 --- a/tests/window_contents.rs +++ b/tests/window_contents.rs @@ -329,7 +329,7 @@ fn diff() { let screen2 = parser.screen().clone(); assert_eq!( screen2.contents_diff(&screen1), - b"\x1b[m\x1b[1;6H\x1b[32m bar" + b"\x1b[m\x1b[1;1H\x1b[5C\x1b[32m bar" ); compare_diff(&screen1, &screen2, b""); @@ -343,14 +343,17 @@ fn diff() { parser.process(b"\x1b[1;7H\x1b[32mbaz"); let screen4 = parser.screen().clone(); - assert_eq!(screen4.contents_diff(&screen3), b"\x1b[m\x1b[1;9H\x1b[32mz"); + assert_eq!( + screen4.contents_diff(&screen3), + b"\x1b[m\x1b[1;1H\x1b[8C\x1b[32mz" + ); compare_diff(&screen3, &screen4, b"\x1b[5C\x1b[32m bar\x1b[H\x1b[31mfoo"); parser.process(b"\x1b[1;8H\x1b[X"); let screen5 = parser.screen().clone(); assert_eq!( screen5.contents_diff(&screen4), - b"\x1b[m\x1b[1;8H\x1b[X\x1b[C\x1b[1;8H" + b"\x1b[m\x1b[1;1H\x1b[7C\x1b[X\x1b[C\x1b[1;8H" ); compare_diff( &screen4, |