aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-29 05:21:54 -0500
committerJesse Luehrs <doy@tozt.net>2019-12-05 12:54:34 -0500
commita0cbd79c92f9a4703f254291d7fbffaa2c84ffb0 (patch)
treef135beab16e7abcd85a9cc04d23bf33ae564aab5
parent3fbc74f513a5a691dd99705598c3023f3b8bc173 (diff)
downloadvt100-rust-a0cbd79c92f9a4703f254291d7fbffaa2c84ffb0.tar.gz
vt100-rust-a0cbd79c92f9a4703f254291d7fbffaa2c84ffb0.zip
ensure cells with contents always have width
it gets ambiguous where the zero-width characters should go otherwise
-rw-r--r--CHANGELOG.md3
-rw-r--r--src/cell.rs4
-rw-r--r--tests/text.rs6
3 files changed, 13 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 969385a..bc2c52f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,9 @@
* Fix a couple more end-of-line/wrapping bugs.
* Fix applying combining characters to wide characters.
+* Ensure cells can't have contents with width zero (to avoid ambiguity). If an
+ empty cell gets a combining character applied to it, default that cell to a
+ (normal-width) space first.
## [0.7.0] - 2019-11-23
diff --git a/src/cell.rs b/src/cell.rs
index 5da4452..f9f9056 100644
--- a/src/cell.rs
+++ b/src/cell.rs
@@ -44,6 +44,10 @@ impl Cell {
if self.len() >= CODEPOINTS_IN_CELL {
return;
}
+ if self.len() == 0 {
+ self.contents[self.len()] = ' ';
+ self.len += 1;
+ }
self.contents[self.len()] = c;
self.len += 1;
diff --git a/tests/text.rs b/tests/text.rs
index d153f11..74001d1 100644
--- a/tests/text.rs
+++ b/tests/text.rs
@@ -167,6 +167,12 @@ fn combining() {
parser.process("\x1b[H\x1b[Ja\u{0301}".as_bytes());
assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "a\u{0301}");
assert_eq!(parser.screen().cell(0, 1).unwrap().contents(), "");
+
+ parser.process("\x1b[H\x1b[J\x1b[2C\u{0301}".as_bytes());
+ assert_eq!(parser.screen().cell(0, 0).unwrap().contents(), "");
+ assert_eq!(parser.screen().cell(0, 1).unwrap().contents(), " \u{0301}");
+ assert_eq!(parser.screen().cell(0, 2).unwrap().contents(), "");
+ assert_eq!(parser.screen().cell(0, 3).unwrap().contents(), "");
}
#[test]