On 30/03/2021 22:21, Jacek Caban wrote:
Hi Gabriel,
On 3/30/21 6:33 PM, Gabriel Ivăncescu wrote:
Remember the fact we completed the entire line in cursor_x, but report it as usual in other cases as the last character on the line. When writing a new character, a newline is then written so it wraps properly.
This doesn't seem to match what we should report to console client. See the attached test (which applies on top of your patch).
Thanks, Jacek
Ok so, I admit I don't really understand the existing tests—or wine's behavior here. It seems that wine's conhost delays outputting a newline until a character is written. Then it writes the newline before the character. This is the current behavior.
On the other hand, from the tests I seen, Windows writes a newline as soon as a character is written that reaches the screen buffer width and needs to wrap around.
For example, if we have 2 characters until the end of the line, and we write "abc":
wine: a, b, \r\nc windows: a, b\r\n, c
If we write "ab":
wine: a, b, \b windows: a, b\r\n
In second case, wine doesn't output a newline at all. Instead, because of the "cursor_x--" thing, it outputs a \b instead. And of course since we don't keep track of this, the next write will overwrite the last character on the line (i.e. the "b") which is the problem here.
What I don't understand, though, is why the tests accommodate for Wine's behavior? I assumed it was intentional, that is why my patch keeps this current behavior and just fixes this corner case where writes finish on line end (like the second example above with "ab").
In the current *existing* tests, you can see stuff like:
if (!skip_sequence("\b")) expect_output_sequence("\r\n");
This makes it pass on Windows, since it always outputs a newline immediately and never a backspace. In fact, removing the condition at all will *still* pass on Windows. So this condition is there for Wine? Is there a reason for it? And what should I keep in mind here to solve this "properly"?
If you remove the condition, of course wine will fail the tests, but Windows won't. I really don't understand it.
Thanks, Gabriel