Module: wine Branch: master Commit: fc408f3d4376722dbe173495be10ef2ce34874d1 URL: https://source.winehq.org/git/wine.git/?a=commit;h=fc408f3d4376722dbe173495b...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Sep 21 17:06:03 2020 +0200
conhost: Force using relative cursor positioning in update_read_output.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
programs/conhost/conhost.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c index 97855e5e32..3f7b5fb914 100644 --- a/programs/conhost/conhost.c +++ b/programs/conhost/conhost.c @@ -309,6 +309,27 @@ static void set_tty_cursor( struct console *console, unsigned int x, unsigned in tty_write( console, buf, strlen(buf) ); }
+static void set_tty_cursor_relative( struct console *console, unsigned int x, unsigned int y ) +{ + if (y < console->tty_cursor_y) + { + char buf[64]; + sprintf( buf, "\x1b[%uA", console->tty_cursor_y - y ); + tty_write( console, buf, strlen(buf) ); + console->tty_cursor_y = y; + } + else + { + while (console->tty_cursor_y < y) + { + console->tty_cursor_x = 0; + console->tty_cursor_y++; + tty_write( console, "\r\n", 2 ); + } + } + set_tty_cursor( console, x, y ); +} + static void set_tty_attr( struct console *console, unsigned int attr ) { char buf[8]; @@ -1216,7 +1237,16 @@ static void update_read_output( struct console *console ) } }
- update_output( screen_buffer, &update_rect ); + /* always try to use relative cursor positions in UNIX mode so that it works even if cursor + * position is out of sync */ + if (update_rect.left <= update_rect.right && update_rect.top <= update_rect.bottom) + { + if (console->is_unix) + set_tty_cursor_relative( screen_buffer->console, update_rect.left, update_rect.top ); + update_output( screen_buffer, &update_rect ); + } + if (console->is_unix) + set_tty_cursor_relative( screen_buffer->console, screen_buffer->cursor_x, screen_buffer->cursor_y ); tty_sync( screen_buffer->console ); }