aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-12-05 15:09:22 -0500
committerJesse Luehrs <doy@tozt.net>2019-12-06 21:26:07 -0500
commit0dcb7be129f4bb8f97a62cc3676be1eee7858b74 (patch)
treea6353aea6a3b37489274dc2e0c810b317741c7f0
parent532a9b9417f26c2d7011e4f1b79d556db717a650 (diff)
downloadvt100-rust-0dcb7be129f4bb8f97a62cc3676be1eee7858b74.tar.gz
vt100-rust-0dcb7be129f4bb8f97a62cc3676be1eee7858b74.zip
zero-width characters shouldn't clear wide characters
-rw-r--r--src/screen.rs65
-rw-r--r--tests/data/fixtures/wide.in1
-rw-r--r--tests/data/fixtures/wide/23.json20
-rw-r--r--tests/data/fixtures/wide/23.typescript1
4 files changed, 55 insertions, 32 deletions
diff --git a/src/screen.rs b/src/screen.rs
index 8bb8b0e..afe50b8 100644
--- a/src/screen.rs
+++ b/src/screen.rs
@@ -589,38 +589,6 @@ impl Screen {
let pos = self.grid().pos();
let size = self.grid().size();
let attrs = self.attrs;
- let drawing_pos = if pos.col < size.cols {
- pos
- } else {
- crate::grid::Pos {
- row: pos.row + 1,
- col: 0,
- }
- };
-
- if self
- .drawing_cell(drawing_pos)
- .unwrap()
- .is_wide_continuation()
- {
- let prev_cell = self
- .drawing_cell_mut(crate::grid::Pos {
- row: drawing_pos.row,
- col: drawing_pos.col - 1,
- })
- .unwrap();
- prev_cell.clear(attrs);
- }
-
- if self.drawing_cell(drawing_pos).unwrap().is_wide() {
- let next_cell = self
- .drawing_cell_mut(crate::grid::Pos {
- row: drawing_pos.row,
- col: drawing_pos.col + 1,
- })
- .unwrap();
- next_cell.clear(attrs);
- }
let width = c.width().unwrap_or(0).try_into().unwrap();
@@ -700,6 +668,39 @@ impl Screen {
}
}
} else {
+ let drawing_pos = if pos.col < size.cols {
+ pos
+ } else {
+ crate::grid::Pos {
+ row: pos.row + 1,
+ col: 0,
+ }
+ };
+
+ if self
+ .drawing_cell(drawing_pos)
+ .unwrap()
+ .is_wide_continuation()
+ {
+ let prev_cell = self
+ .drawing_cell_mut(crate::grid::Pos {
+ row: drawing_pos.row,
+ col: drawing_pos.col - 1,
+ })
+ .unwrap();
+ prev_cell.clear(attrs);
+ }
+
+ if self.drawing_cell(drawing_pos).unwrap().is_wide() {
+ let next_cell = self
+ .drawing_cell_mut(crate::grid::Pos {
+ row: drawing_pos.row,
+ col: drawing_pos.col + 1,
+ })
+ .unwrap();
+ next_cell.clear(attrs);
+ }
+
let cell = self.current_cell_mut();
cell.set(c, attrs);
self.grid_mut().col_inc(1);
diff --git a/tests/data/fixtures/wide.in b/tests/data/fixtures/wide.in
index ecce1df..c4752b3 100644
--- a/tests/data/fixtures/wide.in
+++ b/tests/data/fixtures/wide.in
@@ -20,3 +20,4 @@ aデbネ
\x1bcデネa\x08\x08\x08\x08\x1b[2P
\x1bcデ\x08\x1b[X
\x1bcデ\x08\x08\x1b[X
+\x1bcaデ\rb\u{301}
diff --git a/tests/data/fixtures/wide/23.json b/tests/data/fixtures/wide/23.json
new file mode 100644
index 0000000..0c96e16
--- /dev/null
+++ b/tests/data/fixtures/wide/23.json
@@ -0,0 +1,20 @@
+{
+ "contents": "b́デ",
+ "cells": {
+ "0,0": {
+ "contents": "b́"
+ },
+ "0,1": {
+ "contents": "デ",
+ "is_wide": true
+ },
+ "0,2": {
+ "contents": "",
+ "is_wide_continuation": true
+ }
+ },
+ "cursor_position": [
+ 0,
+ 1
+ ]
+} \ No newline at end of file
diff --git a/tests/data/fixtures/wide/23.typescript b/tests/data/fixtures/wide/23.typescript
new file mode 100644
index 0000000..89d66be
--- /dev/null
+++ b/tests/data/fixtures/wide/23.typescript
@@ -0,0 +1 @@
+caデ b́ \ No newline at end of file