chardev/char-win-stdio.c: restore old console mode
If I use `-serial stdio` on Windows, after QEMU exits, the terminal could not handle arrow keys and tab any more. Because stdio backend on Windows sets console mode to virtual terminal input when starts, but does not restore the old mode when finalize. This small patch saves the old console mode and set it back. Signed-off-by: Ziming Song <s.ziming@hotmail.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-ID: <ME3P282MB25488BE7C39BF0C35CD0DA5D8CA82@ME3P282MB2548.AUSP282.PROD.OUTLOOK.COM>
This commit is contained in:
parent
865714cb3b
commit
903cc9e117
@ -33,6 +33,7 @@
|
|||||||
struct WinStdioChardev {
|
struct WinStdioChardev {
|
||||||
Chardev parent;
|
Chardev parent;
|
||||||
HANDLE hStdIn;
|
HANDLE hStdIn;
|
||||||
|
DWORD dwOldMode;
|
||||||
HANDLE hInputReadyEvent;
|
HANDLE hInputReadyEvent;
|
||||||
HANDLE hInputDoneEvent;
|
HANDLE hInputDoneEvent;
|
||||||
HANDLE hInputThread;
|
HANDLE hInputThread;
|
||||||
@ -159,6 +160,7 @@ static void qemu_chr_open_stdio(Chardev *chr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
is_console = GetConsoleMode(stdio->hStdIn, &dwMode) != 0;
|
is_console = GetConsoleMode(stdio->hStdIn, &dwMode) != 0;
|
||||||
|
stdio->dwOldMode = dwMode;
|
||||||
|
|
||||||
if (is_console) {
|
if (is_console) {
|
||||||
if (qemu_add_wait_object(stdio->hStdIn,
|
if (qemu_add_wait_object(stdio->hStdIn,
|
||||||
@ -221,6 +223,9 @@ static void char_win_stdio_finalize(Object *obj)
|
|||||||
{
|
{
|
||||||
WinStdioChardev *stdio = WIN_STDIO_CHARDEV(obj);
|
WinStdioChardev *stdio = WIN_STDIO_CHARDEV(obj);
|
||||||
|
|
||||||
|
if (stdio->hStdIn != INVALID_HANDLE_VALUE) {
|
||||||
|
SetConsoleMode(stdio->hStdIn, stdio->dwOldMode);
|
||||||
|
}
|
||||||
if (stdio->hInputReadyEvent != INVALID_HANDLE_VALUE) {
|
if (stdio->hInputReadyEvent != INVALID_HANDLE_VALUE) {
|
||||||
CloseHandle(stdio->hInputReadyEvent);
|
CloseHandle(stdio->hInputReadyEvent);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user