Use GetConsoleScreenBufferInfo to obtain terminal size and set ENABLE_WINDOW_INPUT to receive resize notifications.
Signed-off-by: Filip Hejsek <filip.hej...@gmail.com> --- chardev/char-win-stdio.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/chardev/char-win-stdio.c b/chardev/char-win-stdio.c index fb802a00b13ac4089abf3bd4f8c4198d8325764b..0d33138d0dd83b582e959d21c3d991de52f8d3e4 100644 --- a/chardev/char-win-stdio.c +++ b/chardev/char-win-stdio.c @@ -44,6 +44,20 @@ typedef struct WinStdioChardev WinStdioChardev; DECLARE_INSTANCE_CHECKER(WinStdioChardev, WIN_STDIO_CHARDEV, TYPE_CHARDEV_WIN_STDIO) +static void char_win_stdio_resize(Chardev *chr) +{ + HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo; + + if (GetConsoleScreenBufferInfo(hStdOut, &ScreenBufferInfo)) { + uint16_t cols = ScreenBufferInfo.srWindow.Right + 1 + - ScreenBufferInfo.srWindow.Left; + uint16_t rows = ScreenBufferInfo.srWindow.Bottom + 1 + - ScreenBufferInfo.srWindow.Top; + qemu_chr_resize(chr, cols, rows); + } +} + static void win_stdio_wait_func(void *opaque) { Chardev *chr = CHARDEV(opaque); @@ -75,6 +89,9 @@ static void win_stdio_wait_func(void *opaque) } } } + if (buf[i].EventType == WINDOW_BUFFER_SIZE_EVENT) { + char_win_stdio_resize(chr); + } } } @@ -202,6 +219,8 @@ static void qemu_chr_open_stdio(Chardev *chr, } else { dwMode &= ~ENABLE_PROCESSED_INPUT; } + dwMode |= ENABLE_WINDOW_INPUT; + char_win_stdio_resize(chr); } SetConsoleMode(stdio->hStdIn, dwMode); -- 2.51.0