diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 77c13e85df4..6a9c1de8057 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -1548,7 +1548,7 @@ struct get_console_mode_reply { struct reply_header __header; int mode; - char __pad_12[4]; + int is_bare; }; @@ -5506,6 +5506,6 @@ union generic_reply struct set_cursor_reply set_cursor_reply; }; -#define SERVER_PROTOCOL_VERSION 406 +#define SERVER_PROTOCOL_VERSION 407 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/console.c b/server/console.c index 905cc5014ab..1fbf736654c 100644 --- a/server/console.c +++ b/server/console.c @@ -188,6 +188,11 @@ static struct list screen_buffer_list = LIST_INIT(screen_buffer_list); static const char_info_t empty_char_info = { ' ', 0x000f }; /* white on black space */ +static int console_input_is_bare( struct console_input* cin ) +{ + return cin->evt == NULL; +} + static struct fd *console_input_get_fd( struct object* obj ) { struct console_input *console_input = (struct console_input*)obj; @@ -582,7 +587,7 @@ static void propagate_console_signal( struct console_input *console, enum_processes(propagate_console_signal_cb, &csi); } -static int get_console_mode( obj_handle_t handle ) +static int get_console_mode( obj_handle_t handle, int *bare ) { struct object *obj; int ret = 0; @@ -590,9 +595,15 @@ static int get_console_mode( obj_handle_t handle ) if ((obj = get_handle_obj( current->process, handle, FILE_READ_PROPERTIES, NULL ))) { if (obj->ops == &console_input_ops) + { ret = ((struct console_input *)obj)->mode; + *bare = console_input_is_bare((struct console_input *)obj); + } else if (obj->ops == &screen_buffer_ops) + { ret = ((struct screen_buffer *)obj)->mode; + *bare = console_input_is_bare(((struct screen_buffer *)obj)->input); + } else set_error( STATUS_OBJECT_TYPE_MISMATCH ); release_object( obj ); @@ -1542,7 +1553,7 @@ DECL_HANDLER(get_console_input_info) /* get a console mode (input or output) */ DECL_HANDLER(get_console_mode) { - reply->mode = get_console_mode( req->handle ); + reply->mode = get_console_mode( req->handle, &reply->is_bare ); } /* set a console mode (input or output) */ diff --git a/server/protocol.def b/server/protocol.def index ceebba13009..c3d2c1d677a 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1224,6 +1224,7 @@ struct console_renderer_event obj_handle_t handle; /* handle to the console */ @REPLY int mode; /* console mode */ + int is_bare; /* whether the console has an evt_queue */ @END diff --git a/server/request.h b/server/request.h index b16dbe9a6b2..cb3f2d93e44 100644 --- a/server/request.h +++ b/server/request.h @@ -976,6 +976,7 @@ C_ASSERT( sizeof(struct get_console_wait_event_reply) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_console_mode_request, handle) == 12 ); C_ASSERT( sizeof(struct get_console_mode_request) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_console_mode_reply, mode) == 8 ); +C_ASSERT( FIELD_OFFSET(struct get_console_mode_reply, is_bare) == 12 ); C_ASSERT( sizeof(struct get_console_mode_reply) == 16 ); C_ASSERT( FIELD_OFFSET(struct set_console_mode_request, handle) == 12 ); C_ASSERT( FIELD_OFFSET(struct set_console_mode_request, mode) == 16 ); diff --git a/server/trace.c b/server/trace.c index c7c12f63038..408fe147c7f 100644 --- a/server/trace.c +++ b/server/trace.c @@ -1641,6 +1641,7 @@ static void dump_get_console_mode_request( const struct get_console_mode_request static void dump_get_console_mode_reply( const struct get_console_mode_reply *req ) { fprintf( stderr, " mode=%d", req->mode ); + fprintf( stderr, ", is_bare=%d", req->is_bare ); } static void dump_set_console_mode_request( const struct set_console_mode_request *req )