Jacek Caban : conhost: Scroll window to cursor position when needed.
Alexandre Julliard
julliard at winehq.org
Wed Oct 7 16:04:09 CDT 2020
Module: wine
Branch: master
Commit: a90017845d2f65ecd8c1bd32c3019bcd2b13ecd1
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a90017845d2f65ecd8c1bd32c3019bcd2b13ecd1
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Oct 6 18:53:30 2020 +0200
conhost: Scroll window to cursor position when needed.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/conhost/conhost.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c
index a54238c80f..7d3564a120 100644
--- a/programs/conhost/conhost.c
+++ b/programs/conhost/conhost.c
@@ -392,6 +392,24 @@ static void empty_update_rect( struct screen_buffer *screen_buffer, RECT *rect )
SetRect( rect, screen_buffer->width, screen_buffer->height, 0, 0 );
}
+static void scroll_to_cursor( struct screen_buffer *screen_buffer )
+{
+ int w = screen_buffer->win.right - screen_buffer->win.left + 1;
+ int h = screen_buffer->win.bottom - screen_buffer->win.top + 1;
+
+ if (screen_buffer->cursor_x < screen_buffer->win.left)
+ screen_buffer->win.left = min( screen_buffer->cursor_x, screen_buffer->width - w );
+ else if (screen_buffer->cursor_x > screen_buffer->win.right)
+ screen_buffer->win.left = max( screen_buffer->cursor_x, w ) - w + 1;
+ screen_buffer->win.right = screen_buffer->win.left + w - 1;
+
+ if (screen_buffer->cursor_y < screen_buffer->win.top)
+ screen_buffer->win.top = min( screen_buffer->cursor_y, screen_buffer->height - h );
+ else if (screen_buffer->cursor_y > screen_buffer->win.bottom)
+ screen_buffer->win.top = max( screen_buffer->cursor_y, h ) - h + 1;
+ screen_buffer->win.bottom = screen_buffer->win.top + h - 1;
+}
+
static void update_output( struct screen_buffer *screen_buffer, RECT *rect )
{
int x, y, size, trailing_spaces;
@@ -1237,6 +1255,7 @@ static void update_read_output( struct console *console )
if (console->is_unix)
set_tty_cursor_relative( screen_buffer->console, update_rect.left, update_rect.top );
update_output( screen_buffer, &update_rect );
+ scroll_to_cursor( screen_buffer );
}
if (console->is_unix)
set_tty_cursor_relative( screen_buffer->console, screen_buffer->cursor_x, screen_buffer->cursor_y );
@@ -1825,6 +1844,7 @@ static NTSTATUS set_output_info( struct screen_buffer *screen_buffer,
{
screen_buffer->cursor_x = info->cursor_x;
screen_buffer->cursor_y = info->cursor_y;
+ scroll_to_cursor( screen_buffer );
}
}
if (params->mask & SET_CONSOLE_OUTPUT_INFO_SIZE)
@@ -1972,6 +1992,7 @@ static NTSTATUS write_console( struct screen_buffer *screen_buffer, const WCHAR
else screen_buffer->cursor_x = update_rect.left;
}
+ scroll_to_cursor( screen_buffer );
update_output( screen_buffer, &update_rect );
tty_sync( screen_buffer->console );
return STATUS_SUCCESS;
More information about the wine-cvs
mailing list