conhost: Delay creating input thread in Unix mode.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
fc408f3d43
commit
158471d676
|
@ -99,6 +99,7 @@ struct console
|
||||||
unsigned int input_cp; /* console input codepage */
|
unsigned int input_cp; /* console input codepage */
|
||||||
unsigned int output_cp; /* console output codepage */
|
unsigned int output_cp; /* console output codepage */
|
||||||
unsigned int win; /* window handle if backend supports it */
|
unsigned int win; /* window handle if backend supports it */
|
||||||
|
HANDLE input_thread; /* input thread handle */
|
||||||
HANDLE tty_input; /* handle to tty input stream */
|
HANDLE tty_input; /* handle to tty input stream */
|
||||||
HANDLE tty_output; /* handle to tty output stream */
|
HANDLE tty_output; /* handle to tty output stream */
|
||||||
char tty_buffer[4096]; /* tty output buffer */
|
char tty_buffer[4096]; /* tty output buffer */
|
||||||
|
@ -1681,11 +1682,20 @@ static DWORD WINAPI tty_input( void *param )
|
||||||
|
|
||||||
EnterCriticalSection( &console_section );
|
EnterCriticalSection( &console_section );
|
||||||
if (console->read_ioctl) read_complete( console, status, NULL, 0, FALSE );
|
if (console->read_ioctl) read_complete( console, status, NULL, 0, FALSE );
|
||||||
|
CloseHandle( console->input_thread );
|
||||||
|
console->input_thread = NULL;
|
||||||
LeaveCriticalSection( &console_section );
|
LeaveCriticalSection( &console_section );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL ensure_tty_input_thread( struct console *console )
|
||||||
|
{
|
||||||
|
if (!console->input_thread)
|
||||||
|
console->input_thread = CreateThread( NULL, 0, tty_input, console, 0, NULL );
|
||||||
|
return console->input_thread != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS screen_buffer_activate( struct screen_buffer *screen_buffer )
|
static NTSTATUS screen_buffer_activate( struct screen_buffer *screen_buffer )
|
||||||
{
|
{
|
||||||
RECT update_rect;
|
RECT update_rect;
|
||||||
|
@ -2424,6 +2434,7 @@ static NTSTATUS console_input_ioctl( struct console *console, unsigned int code,
|
||||||
|
|
||||||
case IOCTL_CONDRV_READ_CONSOLE:
|
case IOCTL_CONDRV_READ_CONSOLE:
|
||||||
if (in_size || *out_size % sizeof(WCHAR)) return STATUS_INVALID_PARAMETER;
|
if (in_size || *out_size % sizeof(WCHAR)) return STATUS_INVALID_PARAMETER;
|
||||||
|
ensure_tty_input_thread( console );
|
||||||
return read_console( console, *out_size );
|
return read_console( console, *out_size );
|
||||||
|
|
||||||
case IOCTL_CONDRV_READ_INPUT:
|
case IOCTL_CONDRV_READ_INPUT:
|
||||||
|
@ -2431,6 +2442,7 @@ static NTSTATUS console_input_ioctl( struct console *console, unsigned int code,
|
||||||
unsigned int blocking;
|
unsigned int blocking;
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
if (in_size && in_size != sizeof(blocking)) return STATUS_INVALID_PARAMETER;
|
if (in_size && in_size != sizeof(blocking)) return STATUS_INVALID_PARAMETER;
|
||||||
|
ensure_tty_input_thread( console );
|
||||||
blocking = in_size && *(unsigned int *)in_data;
|
blocking = in_size && *(unsigned int *)in_data;
|
||||||
if (blocking && !console->record_count && *out_size)
|
if (blocking && !console->record_count && *out_size)
|
||||||
{
|
{
|
||||||
|
@ -2683,7 +2695,7 @@ static int main_loop( struct console *console, HANDLE signal )
|
||||||
int __cdecl wmain(int argc, WCHAR *argv[])
|
int __cdecl wmain(int argc, WCHAR *argv[])
|
||||||
{
|
{
|
||||||
int headless = 0, i, width = 0, height = 0;
|
int headless = 0, i, width = 0, height = 0;
|
||||||
HANDLE signal = NULL, input_thread;
|
HANDLE signal = NULL;
|
||||||
WCHAR *end;
|
WCHAR *end;
|
||||||
|
|
||||||
static struct console console;
|
static struct console console;
|
||||||
|
@ -2764,10 +2776,7 @@ int __cdecl wmain(int argc, WCHAR *argv[])
|
||||||
console.tty_input = GetStdHandle( STD_INPUT_HANDLE );
|
console.tty_input = GetStdHandle( STD_INPUT_HANDLE );
|
||||||
console.tty_output = GetStdHandle( STD_OUTPUT_HANDLE );
|
console.tty_output = GetStdHandle( STD_OUTPUT_HANDLE );
|
||||||
init_tty_output( &console );
|
init_tty_output( &console );
|
||||||
|
if (!console.is_unix && !ensure_tty_input_thread( &console )) return 1;
|
||||||
if (!(input_thread = CreateThread( NULL, 0, tty_input, &console, 0, NULL )))
|
|
||||||
return 1;
|
|
||||||
CloseHandle( input_thread );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return main_loop( &console, signal );
|
return main_loop( &console, signal );
|
||||||
|
|
Loading…
Reference in New Issue