From 0dcb7be129f4bb8f97a62cc3676be1eee7858b74 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 5 Dec 2019 15:09:22 -0500 Subject: zero-width characters shouldn't clear wide characters --- src/screen.rs | 65 +++++++++++++++++----------------- tests/data/fixtures/wide.in | 1 + tests/data/fixtures/wide/23.json | 20 +++++++++++ tests/data/fixtures/wide/23.typescript | 1 + 4 files changed, 55 insertions(+), 32 deletions(-) create mode 100644 tests/data/fixtures/wide/23.json create mode 100644 tests/data/fixtures/wide/23.typescript 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 -- cgit v1.2.3