aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2021-11-20 00:55:54 -0500
committerJesse Luehrs <doy@tozt.net>2021-11-20 00:55:54 -0500
commit6a91e5ba400fc8e343b9694612593a0a101a8959 (patch)
treef183a7ca177be9f443003f7c4b62e6ed7aa22a6d
parentfeccbfb6be9da70f87ac89684f3dca23da3b9947 (diff)
downloadvt100-rust-6a91e5ba400fc8e343b9694612593a0a101a8959.tar.gz
vt100-rust-6a91e5ba400fc8e343b9694612593a0a101a8959.zip
more wrapping + el bugs
-rw-r--r--src/row.rs49
-rw-r--r--tests/data/fixtures/el.in1
-rw-r--r--tests/data/fixtures/el/23.json21
-rw-r--r--tests/data/fixtures/el/23.typescript1
4 files changed, 66 insertions, 6 deletions
diff --git a/src/row.rs b/src/row.rs
index 6f1cc0b..3b0302c 100644
--- a/src/row.rs
+++ b/src/row.rs
@@ -182,8 +182,23 @@ impl Row {
if let Some((prev_col, attrs)) = erase {
if cell.has_contents() || cell.attrs() != attrs {
let new_pos = crate::grid::Pos { row, col: prev_col };
- crate::term::MoveFromTo::new(prev_pos, new_pos)
- .write_buf(contents);
+ if wrapping
+ && prev_pos.row + 1 == new_pos.row
+ && prev_pos.col >= self.cols()
+ {
+ if new_pos.col > 0 {
+ contents.extend(
+ " ".repeat(new_pos.col as usize).as_bytes(),
+ );
+ } else {
+ contents.extend(b" ");
+ crate::term::Backspace::default()
+ .write_buf(contents);
+ }
+ } else {
+ crate::term::MoveFromTo::new(prev_pos, new_pos)
+ .write_buf(contents);
+ }
prev_pos = new_pos;
if &prev_attrs != attrs {
attrs.write_escape_code_diff(contents, &prev_attrs);
@@ -248,8 +263,15 @@ impl Row {
}
if let Some((prev_col, attrs)) = erase {
let new_pos = crate::grid::Pos { row, col: prev_col };
- crate::term::MoveFromTo::new(prev_pos, new_pos)
- .write_buf(contents);
+ if wrapping
+ && prev_pos.row + 1 == new_pos.row
+ && prev_pos.col >= self.cols()
+ {
+ contents.extend(" ".repeat(new_pos.col as usize).as_bytes());
+ } else {
+ crate::term::MoveFromTo::new(prev_pos, new_pos)
+ .write_buf(contents);
+ }
prev_pos = new_pos;
if &prev_attrs != attrs {
attrs.write_escape_code_diff(contents, &prev_attrs);
@@ -326,8 +348,23 @@ impl Row {
if let Some((prev_col, attrs)) = erase {
if cell.has_contents() || cell.attrs() != attrs {
let new_pos = crate::grid::Pos { row, col: prev_col };
- crate::term::MoveFromTo::new(prev_pos, new_pos)
- .write_buf(contents);
+ if wrapping
+ && prev_pos.row + 1 == new_pos.row
+ && prev_pos.col >= self.cols()
+ {
+ if new_pos.col > 0 {
+ contents.extend(
+ " ".repeat(new_pos.col as usize).as_bytes(),
+ );
+ } else {
+ contents.extend(b" ");
+ crate::term::Backspace::default()
+ .write_buf(contents);
+ }
+ } else {
+ crate::term::MoveFromTo::new(prev_pos, new_pos)
+ .write_buf(contents);
+ }
prev_pos = new_pos;
if &prev_attrs != attrs {
attrs.write_escape_code_diff(contents, &prev_attrs);
diff --git a/tests/data/fixtures/el.in b/tests/data/fixtures/el.in
index 108a7d2..7d065d3 100644
--- a/tests/data/fixtures/el.in
+++ b/tests/data/fixtures/el.in
@@ -20,3 +20,4 @@ foo\x1b[5;5Hbarbar\x1b[10;10Hbazbaz\x1b[20;20Hquux
\x1bc\x1b[5;5H
\x1b[41m\x1b[2K
\x1bc\x1b[1;80H\x1b[41ma\x1b[1K
+\x1bc\x1b[1;80H\x1b[41maa\x1b[1K
diff --git a/tests/data/fixtures/el/23.json b/tests/data/fixtures/el/23.json
new file mode 100644
index 0000000..f2490f0
--- /dev/null
+++ b/tests/data/fixtures/el/23.json
@@ -0,0 +1,21 @@
+{
+ "contents": " a",
+ "cells": {
+ "0,79": {
+ "contents": "a",
+ "bgcolor": "1"
+ },
+ "1,0": {
+ "contents": "",
+ "bgcolor": "1"
+ },
+ "1,1": {
+ "contents": "",
+ "bgcolor": "1"
+ }
+ },
+ "cursor_position": [
+ 1,
+ 1
+ ]
+} \ No newline at end of file
diff --git a/tests/data/fixtures/el/23.typescript b/tests/data/fixtures/el/23.typescript
new file mode 100644
index 0000000..022194c
--- /dev/null
+++ b/tests/data/fixtures/el/23.typescript
@@ -0,0 +1 @@
+caa \ No newline at end of file