aboutsummaryrefslogtreecommitdiffstats
path: root/src/row.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/row.rs')
-rw-r--r--src/row.rs49
1 files changed, 43 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);