Jacek Caban : conhost: Implement IOCTL_CONDRV_GET_OUTPUT_INFO.

Alexandre Julliard julliard at winehq.org
Fri Aug 28 15:17:58 CDT 2020


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Aug 28 14:25:13 2020 +0200

conhost: Implement IOCTL_CONDRV_GET_OUTPUT_INFO.

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

---

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

diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c
index 7c20cd4eb3..f20d8c29ec 100644
--- a/programs/conhost/conhost.c
+++ b/programs/conhost/conhost.c
@@ -42,6 +42,16 @@ struct history_line
     WCHAR  text[1];
 };
 
+struct font_info
+{
+    short int width;
+    short int height;
+    short int weight;
+    short int pitch_family;
+    WCHAR    *face_name;
+    size_t    face_len;
+};
+
 struct console
 {
     HANDLE                server;        /* console server handle */
@@ -70,6 +80,17 @@ struct screen_buffer
     unsigned int          mode;          /* output mode */
     unsigned int          width;         /* size (w-h) of the screen buffer */
     unsigned int          height;
+    unsigned int          cursor_size;   /* size of cursor (percentage filled) */
+    unsigned int          cursor_visible;/* cursor visibility flag */
+    unsigned int          cursor_x;      /* position of cursor */
+    unsigned int          cursor_y;      /* position of cursor */
+    unsigned short        attr;          /* default fill attributes (screen colors) */
+    unsigned short        popup_attr;    /* pop-up color attributes */
+    unsigned int          max_width;     /* size (w-h) of the window given font size */
+    unsigned int          max_height;
+    unsigned int          color_map[16]; /* color table */
+    RECT                  win;           /* current visible window on the screen buffer */
+    struct font_info      font;          /* console font information */
     struct wine_rb_entry  entry;         /* map entry */
 };
 
@@ -104,8 +125,27 @@ static struct screen_buffer *create_screen_buffer( struct console *console, int
     screen_buffer->console        = console;
     screen_buffer->id             = id;
     screen_buffer->mode           = ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT;
+    screen_buffer->cursor_size    = 100;
+    screen_buffer->cursor_visible = 1;
+    screen_buffer->cursor_x       = 0;
+    screen_buffer->cursor_y       = 0;
     screen_buffer->width          = width;
     screen_buffer->height         = height;
+    screen_buffer->attr           = 0x07;
+    screen_buffer->popup_attr     = 0xf5;
+    screen_buffer->max_width      = 80;
+    screen_buffer->max_height     = 25;
+    screen_buffer->win.left       = 0;
+    screen_buffer->win.right      = screen_buffer->max_width - 1;
+    screen_buffer->win.top        = 0;
+    screen_buffer->win.bottom     = screen_buffer->max_height - 1;
+    screen_buffer->font.width     = 0;
+    screen_buffer->font.height    = 0;
+    screen_buffer->font.weight    = FW_NORMAL;
+    screen_buffer->font.pitch_family = FIXED_PITCH | FF_DONTCARE;
+    screen_buffer->font.face_name = NULL;
+    screen_buffer->font.face_len  = 0;
+    memset( screen_buffer->color_map, 0, sizeof(screen_buffer->color_map) );
 
     if (wine_rb_put( &screen_buffer_map, (const void *)id, &screen_buffer->entry ))
     {
@@ -202,6 +242,38 @@ static NTSTATUS write_console_input( struct console *console, const INPUT_RECORD
     return STATUS_SUCCESS;
 }
 
+static NTSTATUS get_output_info( struct screen_buffer *screen_buffer, size_t *out_size )
+{
+    struct condrv_output_info *info;
+
+    TRACE( "%p\n", screen_buffer );
+
+    *out_size = min( *out_size, sizeof(*info) + screen_buffer->font.face_len );
+    if (!(info = alloc_ioctl_buffer( *out_size ))) return STATUS_NO_MEMORY;
+
+    info->cursor_size    = screen_buffer->cursor_size;
+    info->cursor_visible = screen_buffer->cursor_visible;
+    info->cursor_x       = screen_buffer->cursor_x;
+    info->cursor_y       = screen_buffer->cursor_y;
+    info->width          = screen_buffer->width;
+    info->height         = screen_buffer->height;
+    info->attr           = screen_buffer->attr;
+    info->popup_attr     = screen_buffer->popup_attr;
+    info->win_left       = screen_buffer->win.left;
+    info->win_top        = screen_buffer->win.top;
+    info->win_right      = screen_buffer->win.right;
+    info->win_bottom     = screen_buffer->win.bottom;
+    info->max_width      = screen_buffer->max_width;
+    info->max_height     = screen_buffer->max_height;
+    info->font_width     = screen_buffer->font.width;
+    info->font_height    = screen_buffer->font.height;
+    info->font_weight    = screen_buffer->font.weight;
+    info->font_pitch_family = screen_buffer->font.pitch_family;
+    memcpy( info->color_map, screen_buffer->color_map, sizeof(info->color_map) );
+    if (*out_size > sizeof(*info)) memcpy( info + 1, screen_buffer->font.face_name, *out_size - sizeof(*info) );
+    return STATUS_SUCCESS;
+}
+
 static NTSTATUS set_console_title( struct console *console, const WCHAR *in_title, size_t size )
 {
     WCHAR *title = NULL;
@@ -250,6 +322,10 @@ static NTSTATUS screen_buffer_ioctl( struct screen_buffer *screen_buffer, unsign
         TRACE( "set %x mode\n", screen_buffer->mode );
         return STATUS_SUCCESS;
 
+    case IOCTL_CONDRV_GET_OUTPUT_INFO:
+        if (in_size || *out_size < sizeof(struct condrv_output_info)) return STATUS_INVALID_PARAMETER;
+        return get_output_info( screen_buffer, out_size );
+
     default:
         FIXME( "unsupported ioctl %x\n", code );
         return STATUS_NOT_SUPPORTED;




More information about the wine-cvs mailing list