server: Introduce IOCTL_CONDRV_SET_INPUT_INFO ioctl.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
e5851ce937
commit
dcd02876ea
|
@ -32,6 +32,7 @@
|
|||
#define IOCTL_CONDRV_WRITE_INPUT CTL_CODE(FILE_DEVICE_CONSOLE, 11, METHOD_BUFFERED, FILE_WRITE_PROPERTIES)
|
||||
#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)
|
||||
#define IOCTL_CONDRV_SET_INPUT_INFO CTL_CODE(FILE_DEVICE_CONSOLE, 14, METHOD_BUFFERED, FILE_WRITE_PROPERTIES)
|
||||
#define IOCTL_CONDRV_GET_TITLE CTL_CODE(FILE_DEVICE_CONSOLE, 15, METHOD_BUFFERED, FILE_READ_PROPERTIES)
|
||||
|
||||
/* console output ioctls */
|
||||
|
@ -64,10 +65,20 @@ typedef struct
|
|||
/* IOCTL_CONDRV_GET_INPUT_INFO result */
|
||||
struct condrv_input_info
|
||||
{
|
||||
unsigned int input_cp; /* console input codepage */
|
||||
unsigned int output_cp; /* console output codepage */
|
||||
unsigned int history_mode; /* whether we duplicate lines in history */
|
||||
unsigned int history_size; /* number of lines in history */
|
||||
unsigned int edition_mode; /* index to the edition mode flavors */
|
||||
unsigned int input_count; /* number of available input records */
|
||||
condrv_handle_t win; /* renderer window handle */
|
||||
};
|
||||
|
||||
/* IOCTL_CONDRV_SET_INPUT_INFO params */
|
||||
struct condrv_input_info_params
|
||||
{
|
||||
unsigned int mask; /* setting mask */
|
||||
struct condrv_input_info info; /* input_info */
|
||||
};
|
||||
|
||||
/* IOCTL_CONDRV_GET_OUTPUT_INFO result */
|
||||
|
|
|
@ -1577,13 +1577,75 @@ static int console_input_ioctl( struct fd *fd, ioctl_code_t code, struct async *
|
|||
set_error( STATUS_INVALID_PARAMETER );
|
||||
return 0;
|
||||
}
|
||||
info.input_cp = console->input_cp;
|
||||
info.output_cp = console->output_cp;
|
||||
info.history_mode = console->history_mode;
|
||||
info.history_size = console->history_size;
|
||||
info.edition_mode = console->edition_mode;
|
||||
info.input_count = console->recnum;
|
||||
info.win = console->win;
|
||||
return set_reply_data( &info, sizeof(info) ) != NULL;
|
||||
}
|
||||
|
||||
case IOCTL_CONDRV_SET_INPUT_INFO:
|
||||
{
|
||||
const struct condrv_input_info_params *params = get_req_data();
|
||||
if (get_req_data_size() != sizeof(*params))
|
||||
{
|
||||
set_error( STATUS_INVALID_PARAMETER );
|
||||
return 0;
|
||||
}
|
||||
if (params->mask & SET_CONSOLE_INPUT_INFO_HISTORY_MODE)
|
||||
{
|
||||
console->history_mode = params->info.history_mode;
|
||||
}
|
||||
if ((params->mask & SET_CONSOLE_INPUT_INFO_HISTORY_SIZE) &&
|
||||
console->history_size != params->info.history_size)
|
||||
{
|
||||
struct history_line **mem = NULL;
|
||||
int i, delta;
|
||||
|
||||
if (params->info.history_size)
|
||||
{
|
||||
if (!(mem = mem_alloc( params->info.history_size * sizeof(*mem) ))) return 0;
|
||||
memset( mem, 0, params->info.history_size * sizeof(*mem) );
|
||||
}
|
||||
|
||||
delta = (console->history_index > params->info.history_size) ?
|
||||
(console->history_index - params->info.history_size) : 0;
|
||||
|
||||
for (i = delta; i < console->history_index; i++)
|
||||
{
|
||||
mem[i - delta] = console->history[i];
|
||||
console->history[i] = NULL;
|
||||
}
|
||||
console->history_index -= delta;
|
||||
|
||||
for (i = 0; i < console->history_size; i++)
|
||||
free( console->history[i] );
|
||||
free( console->history );
|
||||
console->history = mem;
|
||||
console->history_size = params->info.history_size;
|
||||
}
|
||||
if (params->mask & SET_CONSOLE_INPUT_INFO_EDITION_MODE)
|
||||
{
|
||||
console->edition_mode = params->info.edition_mode;
|
||||
}
|
||||
if (params->mask & SET_CONSOLE_INPUT_INFO_INPUT_CODEPAGE)
|
||||
{
|
||||
console->input_cp = params->info.input_cp;
|
||||
}
|
||||
if (params->mask & SET_CONSOLE_INPUT_INFO_OUTPUT_CODEPAGE)
|
||||
{
|
||||
console->output_cp = params->info.output_cp;
|
||||
}
|
||||
if (params->mask & SET_CONSOLE_INPUT_INFO_WIN)
|
||||
{
|
||||
console->win = params->info.win;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
case IOCTL_CONDRV_GET_TITLE:
|
||||
if (!console->title_len) return 1;
|
||||
return set_reply_data( console->title, min( console->title_len, get_reply_max_size() )) != NULL;
|
||||
|
|
Loading…
Reference in New Issue