conhost: Support relative cursor positioning.

Also add fallback method when legacy console APIs where used.

Signed-off-by: Eric Pouech <eric.pouech@gmail.com>
Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Eric Pouech 2022-03-24 14:46:46 +01:00 committed by Alexandre Julliard
parent 9198ca27d0
commit bb05f13fd8
2 changed files with 19 additions and 0 deletions

View File

@ -328,6 +328,12 @@ static void init_tty_output( struct console *console )
console->tty_cursor_visible = TRUE;
}
/* no longer use relative cursor positionning (legacy API have been used) */
static void enter_absolute_mode( struct console *console )
{
console->use_relative_cursor = 0;
}
static void scroll_to_cursor( struct screen_buffer *screen_buffer )
{
unsigned int cursor_x = get_bounded_cursor_x( screen_buffer );
@ -1920,13 +1926,17 @@ static NTSTATUS set_output_info( struct screen_buffer *screen_buffer,
if (screen_buffer->cursor_x != info->cursor_x || screen_buffer->cursor_y != info->cursor_y)
{
struct console *console = screen_buffer->console;
screen_buffer->cursor_x = info->cursor_x;
screen_buffer->cursor_y = info->cursor_y;
if (console->use_relative_cursor)
set_tty_cursor_relative( console, screen_buffer->cursor_x, screen_buffer->cursor_y );
scroll_to_cursor( screen_buffer );
}
}
if (params->mask & SET_CONSOLE_OUTPUT_INFO_SIZE)
{
enter_absolute_mode( screen_buffer->console );
/* new screen-buffer cannot be smaller than actual window */
if (info->width < screen_buffer->win.right - screen_buffer->win.left + 1 ||
info->height < screen_buffer->win.bottom - screen_buffer->win.top + 1)
@ -1962,6 +1972,7 @@ static NTSTATUS set_output_info( struct screen_buffer *screen_buffer,
}
if (params->mask & SET_CONSOLE_OUTPUT_INFO_DISPLAY_WINDOW)
{
enter_absolute_mode( screen_buffer->console );
if (info->win_left < 0 || info->win_left > info->win_right ||
info->win_right >= screen_buffer->width ||
info->win_top < 0 || info->win_top > info->win_bottom ||
@ -1980,6 +1991,7 @@ static NTSTATUS set_output_info( struct screen_buffer *screen_buffer,
}
if (params->mask & SET_CONSOLE_OUTPUT_INFO_MAX_SIZE)
{
enter_absolute_mode( screen_buffer->console );
screen_buffer->max_width = info->max_width;
screen_buffer->max_height = info->max_height;
}
@ -2085,6 +2097,7 @@ static NTSTATUS write_output( struct screen_buffer *screen_buffer, const struct
char_info_t *dest;
char *src;
enter_absolute_mode( screen_buffer->console );
if (*out_size == sizeof(SMALL_RECT) && !params->width) return STATUS_INVALID_PARAMETER;
entry_size = params->mode == CHAR_INFO_MODE_TEXTATTR ? sizeof(char_info_t) : sizeof(WCHAR);
@ -2187,6 +2200,7 @@ static NTSTATUS read_output( struct screen_buffer *screen_buffer, const struct c
unsigned int x, y, width;
unsigned int i, count;
enter_absolute_mode( screen_buffer->console );
x = params->x;
y = params->y;
mode = params->mode;
@ -2265,6 +2279,7 @@ static NTSTATUS fill_output( struct screen_buffer *screen_buffer, const struct c
TRACE( "(%u %u) mode %u\n", params->x, params->y, params->mode );
enter_absolute_mode( screen_buffer->console );
if (params->y >= screen_buffer->height) return STATUS_SUCCESS;
dest = screen_buffer->data + min( params->y * screen_buffer->width + params->x,
screen_buffer->height * screen_buffer->width );
@ -2318,6 +2333,7 @@ static NTSTATUS scroll_output( struct screen_buffer *screen_buffer, const struct
RECT update_rect;
SMALL_RECT clip;
enter_absolute_mode( screen_buffer->console );
xsrc = params->scroll.Left;
ysrc = params->scroll.Top;
w = params->scroll.Right - params->scroll.Left + 1;
@ -2736,6 +2752,7 @@ static NTSTATUS process_console_ioctls( struct console *console )
if (code == IOCTL_CONDRV_INIT_OUTPUT)
{
TRACE( "initializing output %x\n", output );
enter_absolute_mode( console );
if (console->active)
create_screen_buffer( console, output, console->active->width, console->active->height );
else
@ -2862,6 +2879,7 @@ int __cdecl wmain(int argc, WCHAR *argv[])
if (!wcscmp( argv[i], L"--unix"))
{
console.is_unix = 1;
console.use_relative_cursor = 1;
headless = 1;
continue;
}

View File

@ -78,6 +78,7 @@ struct console
unsigned int mode; /* input mode */
struct screen_buffer *active; /* active screen buffer */
int is_unix; /* UNIX terminal mode */
int use_relative_cursor; /* use relative cursor positionning */
INPUT_RECORD *records; /* input records */
unsigned int record_count; /* number of input records */
unsigned int record_size; /* size of input records buffer */