aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-06 13:11:22 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-06 13:11:22 -0500
commitd778408be8b12fcc16a8fcaccde49bef927f22e0 (patch)
tree0cfbe005a54ca3146d335c98b91203a1e114c392
parent07ecf81b095cc1f23428f05079d65aa5d1677ca4 (diff)
downloadvt100-rust-d778408be8b12fcc16a8fcaccde49bef927f22e0.tar.gz
vt100-rust-d778408be8b12fcc16a8fcaccde49bef927f22e0.zip
make row.contents_diff not require the row index
-rw-r--r--src/grid.rs8
-rw-r--r--src/row.rs14
-rw-r--r--tests/window_contents.rs9
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;
}
diff --git a/src/row.rs b/src/row.rs
index cf47374..fb31594 100644
--- a/src/row.rs
+++ b/src/row.rs
@@ -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,