Jacek Caban : server: Introduce IOCTL_CONDRV_GET_OUTPUT_INFO ioctl.
Alexandre Julliard
julliard at winehq.org
Thu Jul 9 17:10:39 CDT 2020
Module: wine
Branch: master
Commit: af3320c57576166e0d306c1e4d9d4d3964ad58b1
URL: https://source.winehq.org/git/wine.git/?a=commit;h=af3320c57576166e0d306c1e4d9d4d3964ad58b1
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jul 9 19:28:13 2020 +0200
server: Introduce IOCTL_CONDRV_GET_OUTPUT_INFO ioctl.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
include/wine/condrv.h | 27 +++++++++++++++++++++
server/console.c | 65 ++++++++++++++++++++++++++++++++++++++++++---------
2 files changed, 81 insertions(+), 11 deletions(-)
diff --git a/include/wine/condrv.h b/include/wine/condrv.h
index 36412f5731..4d681f6ea7 100644
--- a/include/wine/condrv.h
+++ b/include/wine/condrv.h
@@ -29,6 +29,9 @@
#define IOCTL_CONDRV_PEEK CTL_CODE(FILE_DEVICE_CONSOLE, 12, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_CONDRV_GET_INPUT_INFO CTL_CODE(FILE_DEVICE_CONSOLE, 13, METHOD_BUFFERED, FILE_READ_PROPERTIES)
+/* console output ioctls */
+#define IOCTL_CONDRV_GET_OUTPUT_INFO CTL_CODE(FILE_DEVICE_CONSOLE, 32, METHOD_BUFFERED, FILE_WRITE_PROPERTIES)
+
/* console renderer ioctls */
#define IOCTL_CONDRV_GET_RENDERER_EVENTS CTL_CODE(FILE_DEVICE_CONSOLE, 70, METHOD_BUFFERED, FILE_READ_PROPERTIES)
@@ -41,6 +44,30 @@ struct condrv_input_info
unsigned int input_count; /* number of available input records */
};
+/* IOCTL_CONDRV_GET_OUTPUT_INFO result */
+struct condrv_output_info
+{
+ short int cursor_size; /* size of cursor (percentage filled) */
+ short int cursor_visible; /* cursor visibility flag */
+ short int cursor_x; /* position of cursor (x, y) */
+ short int cursor_y;
+ short int width; /* width of the screen buffer */
+ short int height; /* height of the screen buffer */
+ short int attr; /* default fill attributes (screen colors) */
+ short int popup_attr; /* pop-up color attributes */
+ short int win_left; /* window actually displayed by renderer */
+ short int win_top; /* the rect area is expressed within the */
+ short int win_right; /* boundaries of the screen buffer */
+ short int win_bottom;
+ short int max_width; /* maximum size (width x height) for the window */
+ short int max_height;
+ short int font_width; /* font size (width x height) */
+ short int font_height;
+ short int font_weight; /* font weight */
+ short int font_pitch_family; /* font pitch & family */
+ unsigned int color_map[16]; /* color table */
+};
+
/* IOCTL_CONDRV_GET_RENDERER_EVENTS result */
struct condrv_renderer_event
{
diff --git a/server/console.c b/server/console.c
index d67cec5f4c..22af8e3b35 100644
--- a/server/console.c
+++ b/server/console.c
@@ -553,18 +553,18 @@ static struct screen_buffer *create_console_output( struct console_input *consol
memset( screen_buffer->color_map, 0, sizeof(screen_buffer->color_map) );
list_add_head( &screen_buffer_list, &screen_buffer->entry );
- if (fd == -1)
- screen_buffer->fd = NULL;
+ if (fd != -1)
+ screen_buffer->fd = create_anonymous_fd( &screen_buffer_fd_ops, fd, &screen_buffer->obj,
+ FILE_SYNCHRONOUS_IO_NONALERT );
else
+ screen_buffer->fd = alloc_pseudo_fd( &screen_buffer_fd_ops, &screen_buffer->obj,
+ FILE_SYNCHRONOUS_IO_NONALERT );
+ if (!screen_buffer->fd)
{
- if (!(screen_buffer->fd = create_anonymous_fd( &screen_buffer_fd_ops, fd, &screen_buffer->obj,
- FILE_SYNCHRONOUS_IO_NONALERT )))
- {
- release_object( screen_buffer );
- return NULL;
- }
- allow_fd_caching(screen_buffer->fd);
+ release_object( screen_buffer );
+ return NULL;
}
+ allow_fd_caching(screen_buffer->fd);
if (!(screen_buffer->data = malloc( screen_buffer->width * screen_buffer->height *
sizeof(*screen_buffer->data) )))
@@ -1634,8 +1634,51 @@ static int console_input_ioctl( struct fd *fd, ioctl_code_t code, struct async *
static int screen_buffer_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
{
- set_error( STATUS_INVALID_HANDLE );
- return 0;
+ struct screen_buffer *screen_buffer = get_fd_user( fd );
+
+ switch (code)
+ {
+ case IOCTL_CONDRV_GET_OUTPUT_INFO:
+ {
+ struct condrv_output_info *info;
+ data_size_t size;
+
+ size = min( sizeof(*info) + screen_buffer->font.face_len, get_reply_max_size() );
+ if (size < sizeof(*info))
+ {
+ set_error( STATUS_INVALID_PARAMETER );
+ return 0;
+ }
+ if (!(info = set_reply_data_size( size ))) return 0;
+
+ 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) );
+ size -= sizeof(*info);
+ if (size) memcpy( info + 1, screen_buffer->font.face_name, size );
+ return 1;
+ }
+
+ default:
+ set_error( STATUS_INVALID_HANDLE );
+ return 0;
+ }
}
static int console_input_events_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
More information about the wine-cvs
mailing list