aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2021-11-18 21:04:07 -0500
committerJesse Luehrs <doy@tozt.net>2021-11-18 22:53:20 -0500
commitf973230cb32cf8a397f2456950e1463104e65101 (patch)
tree0d545756f1a2a670c08f521d4cdef5d658ce33b4 /src
parent8bca1d61d49c7c5b9e5997fb11b29eb8c3f03bd5 (diff)
downloadvt100-rust-f973230cb32cf8a397f2456950e1463104e65101.tar.gz
vt100-rust-f973230cb32cf8a397f2456950e1463104e65101.zip
fix some line wrapping state issues
Diffstat (limited to 'src')
-rw-r--r--src/row.rs13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/row.rs b/src/row.rs
index d828a73..cbd73ae 100644
--- a/src/row.rs
+++ b/src/row.rs
@@ -391,7 +391,14 @@ impl Row {
crate::term::ClearRowForward::default().write_buf(contents);
}
- if prev.wrapped && !self.wrapped {
+ // if this row is going from wrapped to not wrapped, we need to erase
+ // and redraw the last character to break wrapping. if this row is
+ // wrapped, we need to redraw the last character without erasing it to
+ // position the cursor after the end of the line correctly so that
+ // drawing the next line can just start writing and be wrapped.
+ if (!self.wrapped && prev.wrapped)
+ || (self.wrapped && prev_pos.col < self.cols())
+ {
let end_pos = if self
.get(self.cols() - 1)
.unwrap()
@@ -410,7 +417,9 @@ impl Row {
crate::term::MoveFromTo::new(prev_pos, end_pos)
.write_buf(contents);
prev_pos = end_pos;
- crate::term::EraseChar::new(1).write_buf(contents);
+ if !self.wrapped {
+ crate::term::EraseChar::new(1).write_buf(contents);
+ }
let end_cell = self.get(end_pos.col).unwrap();
contents.extend(end_cell.contents().as_bytes());
prev_pos.col += if end_cell.is_wide() { 2 } else { 1 };