diff options
author | Jesse Luehrs <doy@tozt.net> | 2019-12-05 15:09:22 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2019-12-06 21:26:07 -0500 |
commit | 0dcb7be129f4bb8f97a62cc3676be1eee7858b74 (patch) | |
tree | a6353aea6a3b37489274dc2e0c810b317741c7f0 | |
parent | 532a9b9417f26c2d7011e4f1b79d556db717a650 (diff) | |
download | vt100-rust-0dcb7be129f4bb8f97a62cc3676be1eee7858b74.tar.gz vt100-rust-0dcb7be129f4bb8f97a62cc3676be1eee7858b74.zip |
zero-width characters shouldn't clear wide characters
-rw-r--r-- | src/screen.rs | 65 | ||||
-rw-r--r-- | tests/data/fixtures/wide.in | 1 | ||||
-rw-r--r-- | tests/data/fixtures/wide/23.json | 20 | ||||
-rw-r--r-- | tests/data/fixtures/wide/23.typescript | 1 |
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 |