aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-29 04:40:39 -0500
committerJesse Luehrs <doy@tozt.net>2019-12-05 12:54:34 -0500
commit3fbc74f513a5a691dd99705598c3023f3b8bc173 (patch)
tree86f0ea6af9604bb2befa8798fe683daa50be76f2
parentdc62fd174f6c5887e958b9b9bc8305ddd7c428a8 (diff)
downloadvt100-rust-3fbc74f513a5a691dd99705598c3023f3b8bc173.tar.gz
vt100-rust-3fbc74f513a5a691dd99705598c3023f3b8bc173.zip
handle wide char wrapping correctly
wrapping a wide char should set the wrapping state of the line even if it wrapped before the last column
-rw-r--r--src/row.rs8
-rw-r--r--tests/text.rs4
2 files changed, 10 insertions, 2 deletions
diff --git a/src/row.rs b/src/row.rs
index 90e92db..36d7d34 100644
--- a/src/row.rs
+++ b/src/row.rs
@@ -167,7 +167,9 @@ impl Row {
if pos != prev_pos {
if !wrapping
|| prev_pos.row + 1 != pos.row
- || prev_pos.col != self.cols()
+ || prev_pos.col
+ < self.cols()
+ - if cell.is_wide() { 1 } else { 0 }
|| pos.col != 0
{
crate::term::MoveFromTo::new(prev_pos, pos)
@@ -260,7 +262,9 @@ impl Row {
if pos != prev_pos {
if !wrapping
|| prev_pos.row + 1 != pos.row
- || prev_pos.col != self.cols()
+ || prev_pos.col
+ < self.cols()
+ - if cell.is_wide() { 1 } else { 0 }
|| pos.col != 0
{
crate::term::MoveFromTo::new(prev_pos, pos)
diff --git a/tests/text.rs b/tests/text.rs
index 51ee297..d153f11 100644
--- a/tests/text.rs
+++ b/tests/text.rs
@@ -226,6 +226,10 @@ fn wrap() {
assert_eq!(parser.screen().cell(1, 2).unwrap().contents(), "a");
assert_eq!(parser.screen().cell(1, 3).unwrap().contents(), "");
+ let mut new_parser = vt100::Parser::default();
+ new_parser.process(&parser.screen().contents_formatted());
+ assert_eq!(new_parser.screen().contents(), parser.screen().contents());
+
parser.process(b"\x1b[H\x1b[J");
assert_eq!(parser.screen().contents(), "");
parser.process(b" ");