Module: wine Branch: master Commit: cd193e44a58f542a919e3c59a82c64e6d2393b76 URL: https://source.winehq.org/git/wine.git/?a=commit;h=cd193e44a58f542a919e3c59a...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Sep 4 13:51:35 2020 +0200
conhost: Update tty output in fill_output.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
programs/conhost/conhost.c | 12 ++++++++++++ programs/conhost/tests/tty.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+)
diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c index b3aa8b4158..8f0a48c097 100644 --- a/programs/conhost/conhost.c +++ b/programs/conhost/conhost.c @@ -883,6 +883,18 @@ static NTSTATUS fill_output( struct screen_buffer *screen_buffer, const struct c return STATUS_INVALID_PARAMETER; }
+ if (count && is_active(screen_buffer)) + { + RECT update_rect; + SetRect( &update_rect, + params->x % screen_buffer->width, + params->y + params->x / screen_buffer->width, + (params->x + i - 1) % screen_buffer->width, + params->y + (params->x + i - 1) / screen_buffer->width ); + update_output( screen_buffer, &update_rect ); + tty_sync( screen_buffer->console ); + } + if (!(result = alloc_ioctl_buffer( sizeof(*result) ))) return STATUS_NO_MEMORY; *result = count; return STATUS_SUCCESS; diff --git a/programs/conhost/tests/tty.c b/programs/conhost/tests/tty.c index 0b63ce82a7..4a0ec30875 100644 --- a/programs/conhost/tests/tty.c +++ b/programs/conhost/tests/tty.c @@ -145,6 +145,7 @@ static BOOL expect_erase_line_(unsigned line, unsigned int cnt)
enum req_type { + REQ_FILL_CHAR, REQ_SET_CURSOR, REQ_SET_TITLE, REQ_WRITE_CHARACTERS, @@ -171,6 +172,12 @@ struct pseudoconsole_req SMALL_RECT region; CHAR_INFO buf[1]; } write_output; + struct + { + WCHAR ch; + DWORD count; + COORD coord; + } fill; } u; };
@@ -252,6 +259,20 @@ static void child_write_output_(unsigned int line, CHAR_INFO *buf, unsigned int ok_(__FILE__,line)(region.Bottom == out_bottom, "Bottom = %u\n", region.Bottom); }
+static void child_fill_character(WCHAR ch, DWORD count, int x, int y) +{ + struct pseudoconsole_req req; + BOOL ret; + + req.type = REQ_FILL_CHAR; + req.u.fill.ch = ch; + req.u.fill.count = count; + req.u.fill.coord.X = x; + req.u.fill.coord.Y = y; + ret = WriteFile(child_pipe, &req, sizeof(req), &count, NULL); + ok(ret, "WriteFile failed: %u\n", GetLastError()); +} + static void test_tty_output(void) { CHAR_INFO char_info_buf[2048], char_info; @@ -463,6 +484,15 @@ static void test_tty_output(void) expect_output_sequence("\x1b[4;3H"); /* set cursor */ expect_output_sequence("\x1b[?25h"); /* show cursor */ expect_empty_output(); + + child_fill_character('i', 5, 15, 16); + expect_hide_cursor(); + expect_output_sequence("\x1b[m"); /* default attributes */ + expect_output_sequence("\x1b[17;16H"); /* set cursor */ + expect_output_sequence("iiiii"); + expect_output_sequence("\x1b[4;3H"); /* set cursor */ + expect_output_sequence("\x1b[?25h"); /* show cursor */ + expect_empty_output(); }
static void child_process(HANDLE pipe) @@ -483,6 +513,12 @@ static void child_process(HANDLE pipe) const struct pseudoconsole_req *req = (void *)buf; switch (req->type) { + case REQ_FILL_CHAR: + ret = FillConsoleOutputCharacterW(output, req->u.fill.ch, req->u.fill.count, req->u.fill.coord, &count); + ok(ret, "FillConsoleOutputCharacter failed: %u\n", GetLastError()); + ok(count == req->u.fill.count, "count = %u, expected %u\n", count, req->u.fill.count); + break; + case REQ_SET_CURSOR: ret = SetConsoleCursorPosition(output, req->u.coord); ok(ret, "SetConsoleCursorPosition failed: %u\n", GetLastError());