From f973230cb32cf8a397f2456950e1463104e65101 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 18 Nov 2021 21:04:07 -0500 Subject: fix some line wrapping state issues --- CHANGELOG.md | 6 + src/row.rs | 13 +- tests/data/fixtures/il_dl.in | 2 + tests/data/fixtures/il_dl/19.json | 252 ++++++++++++++++++++++++++++++++ tests/data/fixtures/il_dl/19.typescript | 1 + tests/data/fixtures/il_dl/20.json | 252 ++++++++++++++++++++++++++++++++ tests/data/fixtures/il_dl/20.typescript | 1 + 7 files changed, 525 insertions(+), 2 deletions(-) create mode 100644 tests/data/fixtures/il_dl/19.json create mode 100644 tests/data/fixtures/il_dl/19.typescript create mode 100644 tests/data/fixtures/il_dl/20.json create mode 100644 tests/data/fixtures/il_dl/20.typescript diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e3d691..123fd37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [Unreleased] + +## Fixed + +* Fixed some line wrapping state issues with `contents_diff` + ## [0.13.0] - 2021-11-17 ### Added 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 }; diff --git a/tests/data/fixtures/il_dl.in b/tests/data/fixtures/il_dl.in index db55d5e..f6ca5e0 100644 --- a/tests/data/fixtures/il_dl.in +++ b/tests/data/fixtures/il_dl.in @@ -16,3 +16,5 @@ b \x1b[L cd \x1bc\na\x1b[1;80Hb\x1b[M +\x1bc\x1b[1;80Haaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\x1b[H +\x1b[L diff --git a/tests/data/fixtures/il_dl/19.json b/tests/data/fixtures/il_dl/19.json new file mode 100644 index 0000000..2f22274 --- /dev/null +++ b/tests/data/fixtures/il_dl/19.json @@ -0,0 +1,252 @@ +{ + "contents": " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "cells": { + "0,79": { + "contents": "a" + }, + "1,0": { + "contents": "a" + }, + "1,1": { + "contents": "a" + }, + "1,10": { + "contents": "a" + }, + "1,11": { + "contents": "a" + }, + "1,12": { + "contents": "a" + }, + "1,13": { + "contents": "a" + }, + "1,14": { + "contents": "a" + }, + "1,15": { + "contents": "a" + }, + "1,16": { + "contents": "a" + }, + "1,17": { + "contents": "a" + }, + "1,18": { + "contents": "a" + }, + "1,19": { + "contents": "a" + }, + "1,2": { + "contents": "a" + }, + "1,20": { + "contents": "a" + }, + "1,21": { + "contents": "a" + }, + "1,22": { + "contents": "a" + }, + "1,23": { + "contents": "a" + }, + "1,24": { + "contents": "a" + }, + "1,25": { + "contents": "a" + }, + "1,26": { + "contents": "a" + }, + "1,27": { + "contents": "a" + }, + "1,28": { + "contents": "a" + }, + "1,29": { + "contents": "a" + }, + "1,3": { + "contents": "a" + }, + "1,30": { + "contents": "a" + }, + "1,31": { + "contents": "a" + }, + "1,32": { + "contents": "a" + }, + "1,33": { + "contents": "a" + }, + "1,34": { + "contents": "a" + }, + "1,35": { + "contents": "a" + }, + "1,36": { + "contents": "a" + }, + "1,37": { + "contents": "a" + }, + "1,38": { + "contents": "a" + }, + "1,39": { + "contents": "a" + }, + "1,4": { + "contents": "a" + }, + "1,40": { + "contents": "a" + }, + "1,41": { + "contents": "a" + }, + "1,42": { + "contents": "a" + }, + "1,43": { + "contents": "a" + }, + "1,44": { + "contents": "a" + }, + "1,45": { + "contents": "a" + }, + "1,46": { + "contents": "a" + }, + "1,47": { + "contents": "a" + }, + "1,48": { + "contents": "a" + }, + "1,49": { + "contents": "a" + }, + "1,5": { + "contents": "a" + }, + "1,50": { + "contents": "a" + }, + "1,51": { + "contents": "a" + }, + "1,52": { + "contents": "a" + }, + "1,53": { + "contents": "a" + }, + "1,54": { + "contents": "a" + }, + "1,55": { + "contents": "a" + }, + "1,56": { + "contents": "a" + }, + "1,57": { + "contents": "a" + }, + "1,58": { + "contents": "a" + }, + "1,59": { + "contents": "a" + }, + "1,6": { + "contents": "a" + }, + "1,60": { + "contents": "a" + }, + "1,61": { + "contents": "a" + }, + "1,62": { + "contents": "a" + }, + "1,63": { + "contents": "a" + }, + "1,64": { + "contents": "a" + }, + "1,65": { + "contents": "a" + }, + "1,66": { + "contents": "a" + }, + "1,67": { + "contents": "a" + }, + "1,68": { + "contents": "a" + }, + "1,69": { + "contents": "a" + }, + "1,7": { + "contents": "a" + }, + "1,70": { + "contents": "a" + }, + "1,71": { + "contents": "a" + }, + "1,72": { + "contents": "a" + }, + "1,73": { + "contents": "a" + }, + "1,74": { + "contents": "a" + }, + "1,75": { + "contents": "a" + }, + "1,76": { + "contents": "a" + }, + "1,77": { + "contents": "a" + }, + "1,78": { + "contents": "a" + }, + "1,79": { + "contents": "a" + }, + "1,8": { + "contents": "a" + }, + "1,9": { + "contents": "a" + } + }, + "cursor_position": [ + 0, + 0 + ] +} \ No newline at end of file diff --git a/tests/data/fixtures/il_dl/19.typescript b/tests/data/fixtures/il_dl/19.typescript new file mode 100644 index 0000000..bdb7b92 --- /dev/null +++ b/tests/data/fixtures/il_dl/19.typescript @@ -0,0 +1 @@ +caaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ No newline at end of file diff --git a/tests/data/fixtures/il_dl/20.json b/tests/data/fixtures/il_dl/20.json new file mode 100644 index 0000000..04b7166 --- /dev/null +++ b/tests/data/fixtures/il_dl/20.json @@ -0,0 +1,252 @@ +{ + "contents": "\n aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "cells": { + "1,79": { + "contents": "a" + }, + "2,0": { + "contents": "a" + }, + "2,1": { + "contents": "a" + }, + "2,10": { + "contents": "a" + }, + "2,11": { + "contents": "a" + }, + "2,12": { + "contents": "a" + }, + "2,13": { + "contents": "a" + }, + "2,14": { + "contents": "a" + }, + "2,15": { + "contents": "a" + }, + "2,16": { + "contents": "a" + }, + "2,17": { + "contents": "a" + }, + "2,18": { + "contents": "a" + }, + "2,19": { + "contents": "a" + }, + "2,2": { + "contents": "a" + }, + "2,20": { + "contents": "a" + }, + "2,21": { + "contents": "a" + }, + "2,22": { + "contents": "a" + }, + "2,23": { + "contents": "a" + }, + "2,24": { + "contents": "a" + }, + "2,25": { + "contents": "a" + }, + "2,26": { + "contents": "a" + }, + "2,27": { + "contents": "a" + }, + "2,28": { + "contents": "a" + }, + "2,29": { + "contents": "a" + }, + "2,3": { + "contents": "a" + }, + "2,30": { + "contents": "a" + }, + "2,31": { + "contents": "a" + }, + "2,32": { + "contents": "a" + }, + "2,33": { + "contents": "a" + }, + "2,34": { + "contents": "a" + }, + "2,35": { + "contents": "a" + }, + "2,36": { + "contents": "a" + }, + "2,37": { + "contents": "a" + }, + "2,38": { + "contents": "a" + }, + "2,39": { + "contents": "a" + }, + "2,4": { + "contents": "a" + }, + "2,40": { + "contents": "a" + }, + "2,41": { + "contents": "a" + }, + "2,42": { + "contents": "a" + }, + "2,43": { + "contents": "a" + }, + "2,44": { + "contents": "a" + }, + "2,45": { + "contents": "a" + }, + "2,46": { + "contents": "a" + }, + "2,47": { + "contents": "a" + }, + "2,48": { + "contents": "a" + }, + "2,49": { + "contents": "a" + }, + "2,5": { + "contents": "a" + }, + "2,50": { + "contents": "a" + }, + "2,51": { + "contents": "a" + }, + "2,52": { + "contents": "a" + }, + "2,53": { + "contents": "a" + }, + "2,54": { + "contents": "a" + }, + "2,55": { + "contents": "a" + }, + "2,56": { + "contents": "a" + }, + "2,57": { + "contents": "a" + }, + "2,58": { + "contents": "a" + }, + "2,59": { + "contents": "a" + }, + "2,6": { + "contents": "a" + }, + "2,60": { + "contents": "a" + }, + "2,61": { + "contents": "a" + }, + "2,62": { + "contents": "a" + }, + "2,63": { + "contents": "a" + }, + "2,64": { + "contents": "a" + }, + "2,65": { + "contents": "a" + }, + "2,66": { + "contents": "a" + }, + "2,67": { + "contents": "a" + }, + "2,68": { + "contents": "a" + }, + "2,69": { + "contents": "a" + }, + "2,7": { + "contents": "a" + }, + "2,70": { + "contents": "a" + }, + "2,71": { + "contents": "a" + }, + "2,72": { + "contents": "a" + }, + "2,73": { + "contents": "a" + }, + "2,74": { + "contents": "a" + }, + "2,75": { + "contents": "a" + }, + "2,76": { + "contents": "a" + }, + "2,77": { + "contents": "a" + }, + "2,78": { + "contents": "a" + }, + "2,79": { + "contents": "a" + }, + "2,8": { + "contents": "a" + }, + "2,9": { + "contents": "a" + } + }, + "cursor_position": [ + 0, + 0 + ] +} \ No newline at end of file diff --git a/tests/data/fixtures/il_dl/20.typescript b/tests/data/fixtures/il_dl/20.typescript new file mode 100644 index 0000000..a330c08 --- /dev/null +++ b/tests/data/fixtures/il_dl/20.typescript @@ -0,0 +1 @@ + \ No newline at end of file -- cgit v1.2.3-54-g00ecf