diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-02-17 15:00:52 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-02-17 15:00:52 +0100 |
commit | 78d21dae9c3a39efb30316d3e38dce120bc1abbd (patch) | |
tree | 5357adccfdb180cd25ea87b895bd067aa89c2ef5 /src/os_win32.c | |
parent | 3678f65d43d10b36dc62738aab2f341fa1e18a32 (diff) | |
download | vim-git-78d21dae9c3a39efb30316d3e38dce120bc1abbd.tar.gz |
patch 8.1.0940: MS-Windows console resizing not handled properlyv8.1.0940
Problem: MS-Windows console resizing not handled properly.
Solution: Handle resizing the console better. (Nobuhiro Takasaki,
closes #3968, closes #3611)
Diffstat (limited to 'src/os_win32.c')
-rw-r--r-- | src/os_win32.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/src/os_win32.c b/src/os_win32.c index 97fc2a401..a392d13b2 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -1492,6 +1492,8 @@ handle_focus_event(INPUT_RECORD ir) ui_focus_change((int)g_fJustGotFocus); } +static void ResizeConBuf(HANDLE hConsole, COORD coordScreen); + /* * Wait until console input from keyboard or mouse is available, * or the time is up. @@ -1657,11 +1659,18 @@ WaitForChar(long msec, int ignore_input) handle_focus_event(ir); else if (ir.EventType == WINDOW_BUFFER_SIZE_EVENT) { - /* Only call shell_resized() when the size actually change to - * avoid the screen is cleard. */ - if (ir.Event.WindowBufferSizeEvent.dwSize.X != Columns - || ir.Event.WindowBufferSizeEvent.dwSize.Y != Rows) + COORD dwSize = ir.Event.WindowBufferSizeEvent.dwSize; + + // Only call shell_resized() when the size actually change to + // avoid the screen is cleard. + if (dwSize.X != Columns || dwSize.Y != Rows) + { + CONSOLE_SCREEN_BUFFER_INFO csbi; + GetConsoleScreenBufferInfo(g_hConOut, &csbi); + dwSize.Y = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; + ResizeConBuf(g_hConOut, dwSize); shell_resized(); + } } #ifdef FEAT_MOUSE else if (ir.EventType == MOUSE_EVENT @@ -6327,7 +6336,7 @@ write_chars( * character was written, otherwise we get stuck. */ if (WriteConsoleOutputCharacterW(g_hConOut, unicodebuf, length, coord, &cchwritten) == 0 - || cchwritten == 0) + || cchwritten == 0 || cchwritten == (DWORD)-1) cchwritten = 1; } else @@ -6361,7 +6370,7 @@ write_chars( * character was written, otherwise we get stuck. */ if (WriteConsoleOutputCharacter(g_hConOut, (LPCSTR)pchBuf, cbToWrite, coord, &written) == 0 - || written == 0) + || written == 0 || written == (DWORD)-1) written = 1; } else @@ -7707,7 +7716,7 @@ vtp_flag_init(void) } -#ifndef FEAT_GUI_W32 +#if !defined(FEAT_GUI_W32) || defined(PROTO) static void vtp_init(void) @@ -7931,3 +7940,28 @@ is_conpty_stable(void) { return conpty_stable; } + +#if !defined(FEAT_GUI_W32) || defined(PROTO) + void +resize_console_buf(void) +{ + CONSOLE_SCREEN_BUFFER_INFO csbi; + COORD coord; + SMALL_RECT newsize; + + if (GetConsoleScreenBufferInfo(g_hConOut, &csbi)) + { + coord.X = SRWIDTH(csbi.srWindow); + coord.Y = SRHEIGHT(csbi.srWindow); + SetConsoleScreenBufferSize(g_hConOut, coord); + + newsize.Left = 0; + newsize.Top = 0; + newsize.Right = coord.X - 1; + newsize.Bottom = coord.Y - 1; + SetConsoleWindowInfo(g_hConOut, TRUE, &newsize); + + SetConsoleScreenBufferSize(g_hConOut, coord); + } +} +#endif |