Jacek Caban : conhost: Support tty output in write_output.

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


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

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

conhost: Support tty output in write_output.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/conhost/conhost.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 67 insertions(+)

diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c
index 02e3789c3e..b3aa8b4158 100644
--- a/programs/conhost/conhost.c
+++ b/programs/conhost/conhost.c
@@ -327,6 +327,45 @@ static void init_tty_output( struct console *console )
     console->tty_cursor_visible = TRUE;
 }
 
+static void update_output( struct screen_buffer *screen_buffer, const RECT *rect )
+{
+    int x, y, size, trailing_spaces;
+    char_info_t *ch;
+    char buf[8];
+
+    if (!is_active( screen_buffer ) || !screen_buffer->console->tty_output) return;
+    TRACE( "%s\n", wine_dbgstr_rect( rect ));
+
+    hide_tty_cursor( screen_buffer->console );
+
+    for (y = rect->top; y <= rect->bottom; y++)
+    {
+        for (trailing_spaces = 0; trailing_spaces < screen_buffer->width; trailing_spaces++)
+        {
+            ch = &screen_buffer->data[(y + 1) * screen_buffer->width - trailing_spaces - 1];
+            if (ch->ch != ' ' || ch->attr != 7) break;
+        }
+        if (trailing_spaces < 4) trailing_spaces = 0;
+
+        for (x = rect->left; x <= rect->right; x++)
+        {
+            ch = &screen_buffer->data[y * screen_buffer->width + x];
+            set_tty_attr( screen_buffer->console, ch->attr );
+            set_tty_cursor( screen_buffer->console, x, y );
+
+            if (x + trailing_spaces >= screen_buffer->width)
+            {
+                tty_write( screen_buffer->console, "\x1b[K", 3 );
+                break;
+            }
+
+            size = WideCharToMultiByte( CP_UTF8, 0, &ch->ch, 1, buf, sizeof(buf), NULL, NULL );
+            tty_write( screen_buffer->console, buf, size );
+            screen_buffer->console->tty_cursor_x++;
+        }
+    }
+}
+
 static NTSTATUS read_console_input( struct console *console, size_t out_size )
 {
     size_t count = min( out_size / sizeof(INPUT_RECORD), console->record_count );
@@ -671,6 +710,34 @@ static NTSTATUS write_output( struct screen_buffer *screen_buffer, const struct
         }
     }
 
+    if (i && is_active( screen_buffer ))
+    {
+        RECT update_rect;
+
+        update_rect.left = params->x;
+        update_rect.top  = params->y;
+        if (params->width)
+        {
+            update_rect.bottom = min( params->y + entry_cnt / params->width, screen_buffer->height ) - 1;
+            update_rect.right  = min( params->x + params->width, screen_buffer->width ) - 1;
+        }
+        else
+        {
+            update_rect.bottom = params->y + (params->x + i - 1) / screen_buffer->width;
+            if (update_rect.bottom != params->y)
+            {
+                update_rect.left = 0;
+                update_rect.right = screen_buffer->width - 1;
+            }
+            else
+            {
+                update_rect.right = params->x + i - 1;
+            }
+        }
+        update_output( screen_buffer, &update_rect );
+        tty_sync( screen_buffer->console );
+    }
+
     if (*out_size == sizeof(SMALL_RECT))
     {
         SMALL_RECT *region;




More information about the wine-cvs mailing list