Jacek Caban : kernel32: Use new IOCTL_CONDRV_SCROLL ioctl for FlushConsoleInputBuffer implementation.
Alexandre Julliard
julliard at winehq.org
Thu Oct 15 15:41:10 CDT 2020
Module: wine
Branch: master
Commit: 6f05b299bce211ef11dd5b046da4247e111cb91d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=6f05b299bce211ef11dd5b046da4247e111cb91d
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Oct 15 18:19:36 2020 +0200
kernel32: Use new IOCTL_CONDRV_SCROLL ioctl for FlushConsoleInputBuffer implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/console.c | 28 +---------------------------
include/wine/condrv.h | 1 +
programs/conhost/conhost.c | 10 ++++++++--
3 files changed, 10 insertions(+), 29 deletions(-)
diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c
index 2b46fe5589f..f9d24f5c885 100644
--- a/dlls/kernel32/console.c
+++ b/dlls/kernel32/console.c
@@ -148,38 +148,12 @@ HANDLE WINAPI GetConsoleInputWaitHandle(void)
}
-/******************************************************************************
- * read_console_input
- *
- * Helper function for ReadConsole, ReadConsoleInput and FlushConsoleInputBuffer
- *
- * Returns
- * 0 for error, 1 for no INPUT_RECORD ready, 2 with INPUT_RECORD ready
- */
-enum read_console_input_return {rci_error = 0, rci_timeout = 1, rci_gotone = 2};
-
-static enum read_console_input_return read_console_input(HANDLE handle, PINPUT_RECORD ir, DWORD timeout)
-{
- int blocking = timeout != 0;
- DWORD read_bytes;
-
- if (!DeviceIoControl( handle, IOCTL_CONDRV_READ_INPUT, &blocking, sizeof(blocking), ir, sizeof(*ir), &read_bytes, NULL ))
- return rci_error;
- return read_bytes ? rci_gotone : rci_timeout;
-}
-
-
/***********************************************************************
* FlushConsoleInputBuffer (KERNEL32.@)
*/
BOOL WINAPI FlushConsoleInputBuffer( HANDLE handle )
{
- enum read_console_input_return last;
- INPUT_RECORD ir;
-
- while ((last = read_console_input(handle, &ir, 0)) == rci_gotone);
-
- return last == rci_timeout;
+ return DeviceIoControl( handle, IOCTL_CONDRV_FLUSH, NULL, 0, NULL, 0, NULL, NULL );
}
diff --git a/include/wine/condrv.h b/include/wine/condrv.h
index eed8bc5bfcf..cf2524edc66 100644
--- a/include/wine/condrv.h
+++ b/include/wine/condrv.h
@@ -39,6 +39,7 @@
#define IOCTL_CONDRV_SET_TITLE CTL_CODE(FILE_DEVICE_CONSOLE, 17, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_CONDRV_CTRL_EVENT CTL_CODE(FILE_DEVICE_CONSOLE, 18, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_CONDRV_BEEP CTL_CODE(FILE_DEVICE_CONSOLE, 19, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_CONDRV_FLUSH CTL_CODE(FILE_DEVICE_CONSOLE, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
/* console output ioctls */
#define IOCTL_CONDRV_WRITE_CONSOLE CTL_CODE(FILE_DEVICE_CONSOLE, 30, METHOD_BUFFERED, FILE_WRITE_ACCESS)
diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c
index a93f9be73b2..8fb28e18ba9 100644
--- a/programs/conhost/conhost.c
+++ b/programs/conhost/conhost.c
@@ -2321,8 +2321,8 @@ static NTSTATUS screen_buffer_ioctl( struct screen_buffer *screen_buffer, unsign
return scroll_output( screen_buffer, in_data );
default:
- FIXME( "unsupported ioctl %x\n", code );
- return STATUS_NOT_SUPPORTED;
+ WARN( "invalid ioctl %x\n", code );
+ return STATUS_INVALID_HANDLE;
}
}
@@ -2439,6 +2439,12 @@ static NTSTATUS console_input_ioctl( struct console *console, unsigned int code,
}
return STATUS_SUCCESS;
+ case IOCTL_CONDRV_FLUSH:
+ if (in_size || *out_size) return STATUS_INVALID_PARAMETER;
+ TRACE( "flush\n" );
+ console->record_count = 0;
+ return STATUS_SUCCESS;
+
default:
FIXME( "unsupported ioctl %x\n", code );
return STATUS_NOT_SUPPORTED;
More information about the wine-cvs
mailing list