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 | |
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')
-rw-r--r-- | src/ex_docmd.c | 3 | ||||
-rw-r--r-- | src/normal.c | 3 | ||||
-rw-r--r-- | src/os_win32.c | 48 | ||||
-rw-r--r-- | src/proto/os_win32.pro | 1 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 50 insertions, 7 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c index ccca2f98f..8cdb04674 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -9853,6 +9853,9 @@ ex_redraw(exarg_T *eap) if (need_maketitle) maketitle(); #endif +#if defined(WIN3264) && !defined(FEAT_GUI_W32) + resize_console_buf(); +#endif RedrawingDisabled = r; p_lz = p; diff --git a/src/normal.c b/src/normal.c index 624e34751..ca0d8ff87 100644 --- a/src/normal.c +++ b/src/normal.c @@ -5401,6 +5401,9 @@ nv_clear(cmdarg_T *cap) # endif #endif redraw_later(CLEAR); +#if defined(WIN3264) && !defined(FEAT_GUI_W32) + resize_console_buf(); +#endif } } 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 diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro index 6157e011f..ca5bad629 100644 --- a/src/proto/os_win32.pro +++ b/src/proto/os_win32.pro @@ -75,4 +75,5 @@ int is_term_win32(void); int has_vtp_working(void); int has_conpty_working(void); int is_conpty_stable(void); +void resize_console_buf(void); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c index 06500bd79..e042578cc 100644 --- a/src/version.c +++ b/src/version.c @@ -780,6 +780,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 940, +/**/ 939, /**/ 938, |