From 6a91e5ba400fc8e343b9694612593a0a101a8959 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 20 Nov 2021 00:55:54 -0500 Subject: more wrapping + el bugs --- src/row.rs | 49 +++++++++++++++++++++++++++++++----- tests/data/fixtures/el.in | 1 + tests/data/fixtures/el/23.json | 21 ++++++++++++++++ tests/data/fixtures/el/23.typescript | 1 + 4 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 tests/data/fixtures/el/23.json create mode 100644 tests/data/fixtures/el/23.typescript 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 -- cgit v1.2.3-54-g00ecf