aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2021-11-18 21:04:07 -0500
committerJesse Luehrs <doy@tozt.net>2021-11-18 22:53:20 -0500
commitf973230cb32cf8a397f2456950e1463104e65101 (patch)
tree0d545756f1a2a670c08f521d4cdef5d658ce33b4
parent8bca1d61d49c7c5b9e5997fb11b29eb8c3f03bd5 (diff)
downloadvt100-rust-f973230cb32cf8a397f2456950e1463104e65101.tar.gz
vt100-rust-f973230cb32cf8a397f2456950e1463104e65101.zip
fix some line wrapping state issues
-rw-r--r--CHANGELOG.md6
-rw-r--r--src/row.rs13
-rw-r--r--tests/data/fixtures/il_dl.in2
-rw-r--r--tests/data/fixtures/il_dl/19.json252
-rw-r--r--tests/data/fixtures/il_dl/19.typescript1
-rw-r--r--tests/data/fixtures/il_dl/20.json252
-rw-r--r--tests/data/fixtures/il_dl/20.typescript1
7 files changed, 525 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5e3d691..123fd37 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## [Unreleased]
+
+## Fixed
+
+* Fixed some line wrapping state issues with `contents_diff`
+
## [0.13.0] - 2021-11-17
### Added
diff --git a/src/row.rs b/src/row.rs
index d828a73..cbd73ae 100644
--- a/src/row.rs
+++ b/src/row.rs
@@ -391,7 +391,14 @@ impl Row {
crate::term::ClearRowForward::default().write_buf(contents);
}
- if prev.wrapped && !self.wrapped {
+ // if this row is going from wrapped to not wrapped, we need to erase
+ // and redraw the last character to break wrapping. if this row is
+ // wrapped, we need to redraw the last character without erasing it to
+ // position the cursor after the end of the line correctly so that
+ // drawing the next line can just start writing and be wrapped.
+ if (!self.wrapped && prev.wrapped)
+ || (self.wrapped && prev_pos.col < self.cols())
+ {
let end_pos = if self
.get(self.cols() - 1)
.unwrap()
@@ -410,7 +417,9 @@ impl Row {
crate::term::MoveFromTo::new(prev_pos, end_pos)
.write_buf(contents);
prev_pos = end_pos;
- crate::term::EraseChar::new(1).write_buf(contents);
+ if !self.wrapped {
+ crate::term::EraseChar::new(1).write_buf(contents);
+ }
let end_cell = self.get(end_pos.col).unwrap();
contents.extend(end_cell.contents().as_bytes());
prev_pos.col += if end_cell.is_wide() { 2 } else { 1 };
diff --git a/tests/data/fixtures/il_dl.in b/tests/data/fixtures/il_dl.in
index db55d5e..f6ca5e0 100644
--- a/tests/data/fixtures/il_dl.in
+++ b/tests/data/fixtures/il_dl.in
@@ -16,3 +16,5 @@ b
\x1b[L
cd
\x1bc\na\x1b[1;80Hb\x1b[M
+\x1bc\x1b[1;80Haaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x1b[H
+\x1b[L
diff --git a/tests/data/fixtures/il_dl/19.json b/tests/data/fixtures/il_dl/19.json
new file mode 100644
index 0000000..2f22274
--- /dev/null
+++ b/tests/data/fixtures/il_dl/19.json
@@ -0,0 +1,252 @@
+{
+ "contents": " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ "cells": {
+ "0,79": {
+ "contents": "a"
+ },
+ "1,0": {
+ "contents": "a"
+ },
+ "1,1": {
+ "contents": "a"
+ },
+ "1,10": {
+ "contents": "a"
+ },
+ "1,11": {
+ "contents": "a"
+ },
+ "1,12": {
+ "contents": "a"
+ },
+ "1,13": {
+ "contents": "a"
+ },
+ "1,14": {
+ "contents": "a"
+ },
+ "1,15": {
+ "contents": "a"
+ },
+ "1,16": {
+ "contents": "a"
+ },
+ "1,17": {
+ "contents": "a"
+ },
+ "1,18": {
+ "contents": "a"
+ },
+ "1,19": {
+ "contents": "a"
+ },
+ "1,2": {
+ "contents": "a"
+ },
+ "1,20": {
+ "contents": "a"
+ },
+ "1,21": {
+ "contents": "a"
+ },
+ "1,22": {
+ "contents": "a"
+ },
+ "1,23": {
+ "contents": "a"
+ },
+ "1,24": {
+ "contents": "a"
+ },
+ "1,25": {
+ "contents": "a"
+ },
+ "1,26": {
+ "contents": "a"
+ },
+ "1,27": {
+ "contents": "a"
+ },
+ "1,28": {
+ "contents": "a"
+ },
+ "1,29": {
+ "contents": "a"
+ },
+ "1,3": {
+ "contents": "a"
+ },
+ "1,30": {
+ "contents": "a"
+ },
+ "1,31": {
+ "contents": "a"
+ },
+ "1,32": {
+ "contents": "a"
+ },
+ "1,33": {
+ "contents": "a"
+ },
+ "1,34": {
+ "contents": "a"
+ },
+ "1,35": {
+ "contents": "a"
+ },
+ "1,36": {
+ "contents": "a"
+ },
+ "1,37": {
+ "contents": "a"
+ },
+ "1,38": {
+ "contents": "a"
+ },
+ "1,39": {
+ "contents": "a"
+ },
+ "1,4": {
+ "contents": "a"
+ },
+ "1,40": {
+ "contents": "a"
+ },
+ "1,41": {
+ "contents": "a"
+ },
+ "1,42": {
+ "contents": "a"
+ },
+ "1,43": {
+ "contents": "a"
+ },
+ "1,44": {
+ "contents": "a"
+ },
+ "1,45": {
+ "contents": "a"
+ },
+ "1,46": {
+ "contents": "a"
+ },
+ "1,47": {
+ "contents": "a"
+ },
+ "1,48": {
+ "contents": "a"
+ },
+ "1,49": {
+ "contents": "a"
+ },
+ "1,5": {
+ "contents": "a"
+ },
+ "1,50": {
+ "contents": "a"
+ },
+ "1,51": {
+ "contents": "a"
+ },
+ "1,52": {
+ "contents": "a"
+ },
+ "1,53": {
+ "contents": "a"
+ },
+ "1,54": {
+ "contents": "a"
+ },
+ "1,55": {
+ "contents": "a"
+ },
+ "1,56": {
+ "contents": "a"
+ },
+ "1,57": {
+ "contents": "a"
+ },
+ "1,58": {
+ "contents": "a"
+ },
+ "1,59": {
+ "contents": "a"
+ },
+ "1,6": {
+ "contents": "a"
+ },
+ "1,60": {
+ "contents": "a"
+ },
+ "1,61": {
+ "contents": "a"
+ },
+ "1,62": {
+ "contents": "a"
+ },
+ "1,63": {
+ "contents": "a"
+ },
+ "1,64": {
+ "contents": "a"
+ },
+ "1,65": {
+ "contents": "a"
+ },
+ "1,66": {
+ "contents": "a"
+ },
+ "1,67": {
+ "contents": "a"
+ },
+ "1,68": {
+ "contents": "a"
+ },
+ "1,69": {
+ "contents": "a"
+ },
+ "1,7": {
+ "contents": "a"
+ },
+ "1,70": {
+ "contents": "a"
+ },
+ "1,71": {
+ "contents": "a"
+ },
+ "1,72": {
+ "contents": "a"
+ },
+ "1,73": {
+ "contents": "a"
+ },
+ "1,74": {
+ "contents": "a"
+ },
+ "1,75": {
+ "contents": "a"
+ },
+ "1,76": {
+ "contents": "a"
+ },
+ "1,77": {
+ "contents": "a"
+ },
+ "1,78": {
+ "contents": "a"
+ },
+ "1,79": {
+ "contents": "a"
+ },
+ "1,8": {
+ "contents": "a"
+ },
+ "1,9": {
+ "contents": "a"
+ }
+ },
+ "cursor_position": [
+ 0,
+ 0
+ ]
+} \ No newline at end of file
diff --git a/tests/data/fixtures/il_dl/19.typescript b/tests/data/fixtures/il_dl/19.typescript
new file mode 100644
index 0000000..bdb7b92
--- /dev/null
+++ b/tests/data/fixtures/il_dl/19.typescript
@@ -0,0 +1 @@
+caaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ No newline at end of file
diff --git a/tests/data/fixtures/il_dl/20.json b/tests/data/fixtures/il_dl/20.json
new file mode 100644
index 0000000..04b7166
--- /dev/null
+++ b/tests/data/fixtures/il_dl/20.json
@@ -0,0 +1,252 @@
+{
+ "contents": "\n aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
+ "cells": {
+ "1,79": {
+ "contents": "a"
+ },
+ "2,0": {
+ "contents": "a"
+ },
+ "2,1": {
+ "contents": "a"
+ },
+ "2,10": {
+ "contents": "a"
+ },
+ "2,11": {
+ "contents": "a"
+ },
+ "2,12": {
+ "contents": "a"
+ },
+ "2,13": {
+ "contents": "a"
+ },
+ "2,14": {
+ "contents": "a"
+ },
+ "2,15": {
+ "contents": "a"
+ },
+ "2,16": {
+ "contents": "a"
+ },
+ "2,17": {
+ "contents": "a"
+ },
+ "2,18": {
+ "contents": "a"
+ },
+ "2,19": {
+ "contents": "a"
+ },
+ "2,2": {
+ "contents": "a"
+ },
+ "2,20": {
+ "contents": "a"
+ },
+ "2,21": {
+ "contents": "a"
+ },
+ "2,22": {
+ "contents": "a"
+ },
+ "2,23": {
+ "contents": "a"
+ },
+ "2,24": {
+ "contents": "a"
+ },
+ "2,25": {
+ "contents": "a"
+ },
+ "2,26": {
+ "contents": "a"
+ },
+ "2,27": {
+ "contents": "a"
+ },
+ "2,28": {
+ "contents": "a"
+ },
+ "2,29": {
+ "contents": "a"
+ },
+ "2,3": {
+ "contents": "a"
+ },
+ "2,30": {
+ "contents": "a"
+ },
+ "2,31": {
+ "contents": "a"
+ },
+ "2,32": {
+ "contents": "a"
+ },
+ "2,33": {
+ "contents": "a"
+ },
+ "2,34": {
+ "contents": "a"
+ },
+ "2,35": {
+ "contents": "a"
+ },
+ "2,36": {
+ "contents": "a"
+ },
+ "2,37": {
+ "contents": "a"
+ },
+ "2,38": {
+ "contents": "a"
+ },
+ "2,39": {
+ "contents": "a"
+ },
+ "2,4": {
+ "contents": "a"
+ },
+ "2,40": {
+ "contents": "a"
+ },
+ "2,41": {
+ "contents": "a"
+ },
+ "2,42": {
+ "contents": "a"
+ },
+ "2,43": {
+ "contents": "a"
+ },
+ "2,44": {
+ "contents": "a"
+ },
+ "2,45": {
+ "contents": "a"
+ },
+ "2,46": {
+ "contents": "a"
+ },
+ "2,47": {
+ "contents": "a"
+ },
+ "2,48": {
+ "contents": "a"
+ },
+ "2,49": {
+ "contents": "a"
+ },
+ "2,5": {
+ "contents": "a"
+ },
+ "2,50": {
+ "contents": "a"
+ },
+ "2,51": {
+ "contents": "a"
+ },
+ "2,52": {
+ "contents": "a"
+ },
+ "2,53": {
+ "contents": "a"
+ },
+ "2,54": {
+ "contents": "a"
+ },
+ "2,55": {
+ "contents": "a"
+ },
+ "2,56": {
+ "contents": "a"
+ },
+ "2,57": {
+ "contents": "a"
+ },
+ "2,58": {
+ "contents": "a"
+ },
+ "2,59": {
+ "contents": "a"
+ },
+ "2,6": {
+ "contents": "a"
+ },
+ "2,60": {
+ "contents": "a"
+ },
+ "2,61": {
+ "contents": "a"
+ },
+ "2,62": {
+ "contents": "a"
+ },
+ "2,63": {
+ "contents": "a"
+ },
+ "2,64": {
+ "contents": "a"
+ },
+ "2,65": {
+ "contents": "a"
+ },
+ "2,66": {
+ "contents": "a"
+ },
+ "2,67": {
+ "contents": "a"
+ },
+ "2,68": {
+ "contents": "a"
+ },
+ "2,69": {
+ "contents": "a"
+ },
+ "2,7": {
+ "contents": "a"
+ },
+ "2,70": {
+ "contents": "a"
+ },
+ "2,71": {
+ "contents": "a"
+ },
+ "2,72": {
+ "contents": "a"
+ },
+ "2,73": {
+ "contents": "a"
+ },
+ "2,74": {
+ "contents": "a"
+ },
+ "2,75": {
+ "contents": "a"
+ },
+ "2,76": {
+ "contents": "a"
+ },
+ "2,77": {
+ "contents": "a"
+ },
+ "2,78": {
+ "contents": "a"
+ },
+ "2,79": {
+ "contents": "a"
+ },
+ "2,8": {
+ "contents": "a"
+ },
+ "2,9": {
+ "contents": "a"
+ }
+ },
+ "cursor_position": [
+ 0,
+ 0
+ ]
+} \ No newline at end of file
diff --git a/tests/data/fixtures/il_dl/20.typescript b/tests/data/fixtures/il_dl/20.typescript
new file mode 100644
index 0000000..a330c08
--- /dev/null
+++ b/tests/data/fixtures/il_dl/20.typescript
@@ -0,0 +1 @@
+ \ No newline at end of file