diff options
Diffstat (limited to 'src/screen.rs')
-rw-r--r-- | src/screen.rs | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/src/screen.rs b/src/screen.rs index ec4d204..07363b1 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -588,19 +588,45 @@ impl Screen { } } + let mut wrap = true; + // it doesn't make any sense to wrap if the last column in a row + // didn't already have contents + if pos.col > 1 { + let mut prev_cell = self + .drawing_cell_mut(crate::grid::Pos { + row: pos.row, + col: pos.col - 2, + }) + .unwrap(); + if !prev_cell.is_wide() { + prev_cell = self + .drawing_cell_mut(crate::grid::Pos { + row: pos.row, + col: pos.col - 1, + }) + .unwrap(); + } + if !prev_cell.has_contents() { + wrap = false; + } + } + let width = c.width().unwrap_or(0).try_into().unwrap(); let attrs = self.attrs; - // zero width characters still cause the cursor to wrap - this doesn't - // affect which cell they go into (the "previous cell" for both (row, - // max_col + 1) and (row + 1, 0) is (row, max_col)), but does affect - // further movement afterwards - writing an `a` at (row, max_col) - // followed by a crlf puts the cursor at (row + 1, 0), but writing a - // `à` (specifically `a` followed by a combining grave accent - the - // normalized U+00E0 "latin small letter a with grave" behaves the - // same as `a`) at (row, max_col) followed by a crlf puts the cursor - // at (row + 2, 0) - self.grid_mut().col_wrap(if width == 0 { 1 } else { width }); + self.grid_mut().col_wrap( + // zero width characters still cause the cursor to wrap - this + // doesn't affect which cell they go into (the "previous cell" for + // both (row, max_col + 1) and (row + 1, 0) is (row, max_col)), + // but does affect further movement afterwards - writing an `a` at + // (row, max_col) followed by a crlf puts the cursor at (row + 1, + // 0), but writing a `à` (specifically `a` followed by a combining + // grave accent - the normalized U+00E0 "latin small letter a with + // grave" behaves the same as `a`) at (row, max_col) followed by a + // crlf puts the cursor at (row + 2, 0) + if width == 0 { 1 } else { width }, + wrap, + ); if width == 0 { if pos.col > 0 { |