Jacek Caban : conhost: Update tty output in fill_output.

Alexandre Julliard julliard at winehq.org
Fri Sep 4 15:47:32 CDT 2020


Module: wine
Branch: master
Commit: cd193e44a58f542a919e3c59a82c64e6d2393b76
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=cd193e44a58f542a919e3c59a82c64e6d2393b76

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Sep  4 13:51:35 2020 +0200

conhost: Update tty output in fill_output.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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());




More information about the wine-cvs mailing list