aboutsummaryrefslogtreecommitdiffstats
path: root/src/row.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-05 14:01:42 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-05 14:09:26 -0500
commit2471941ad0ee28a0c27df3f007faa16ff7028fa8 (patch)
tree6415ff09131f50ce020522ddcc98f4268343d91e /src/row.rs
parent2e7f1686d719497d9b2d2d2c8ffba20e6c8214bd (diff)
downloadvt100-rust-2471941ad0ee28a0c27df3f007faa16ff7028fa8.tar.gz
vt100-rust-2471941ad0ee28a0c27df3f007faa16ff7028fa8.zip
add functionality for diffing two terminal screens
Diffstat (limited to 'src/row.rs')
-rw-r--r--src/row.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/row.rs b/src/row.rs
index ade6408..9322c36 100644
--- a/src/row.rs
+++ b/src/row.rs
@@ -126,6 +126,46 @@ impl Row {
(contents, prev_attrs)
}
+ pub fn contents_diff(
+ &self,
+ row_idx: u16,
+ prev: &Self,
+ attrs: crate::attrs::Attrs,
+ ) -> (Vec<u8>, crate::attrs::Attrs) {
+ let mut needs_move = true;
+ let mut contents = vec![];
+ let mut prev_attrs = attrs;
+ for (idx, (cell, prev_cell)) in
+ self.cells().zip(prev.cells()).enumerate()
+ {
+ if cell == prev_cell {
+ needs_move = true;
+ } else {
+ if needs_move {
+ contents.extend(
+ format!("\x1b[{};{}H", row_idx + 1, idx + 1)
+ .as_bytes(),
+ );
+ needs_move = false;
+ }
+
+ let attrs = cell.attrs();
+ if &prev_attrs != attrs {
+ contents.append(&mut attrs.escape_code_diff(&prev_attrs));
+ prev_attrs = *attrs;
+ }
+
+ contents.extend(if cell.has_contents() {
+ cell.contents().as_bytes()
+ } else {
+ b"\x1b[X"
+ });
+ }
+ }
+
+ (contents, prev_attrs)
+ }
+
fn content_width(&self, start: u16) -> u16 {
for (col, cell) in
self.cells.iter().skip(start as usize).enumerate().rev()