server: Introduce IOCTL_CONDRV_GET_OUTPUT_INFO ioctl.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d8739008bd
commit
af3320c575
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
{
|
||||
if (!(screen_buffer->fd = create_anonymous_fd( &screen_buffer_fd_ops, fd, &screen_buffer->obj,
|
||||
FILE_SYNCHRONOUS_IO_NONALERT )))
|
||||
screen_buffer->fd = alloc_pseudo_fd( &screen_buffer_fd_ops, &screen_buffer->obj,
|
||||
FILE_SYNCHRONOUS_IO_NONALERT );
|
||||
if (!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,9 +1634,52 @@ 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 )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue