From 78d21dae9c3a39efb30316d3e38dce120bc1abbd Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 17 Feb 2019 15:00:52 +0100 Subject: patch 8.1.0940: MS-Windows console resizing not handled properly Problem: MS-Windows console resizing not handled properly. Solution: Handle resizing the console better. (Nobuhiro Takasaki, closes #3968, closes #3611) --- src/ex_docmd.c | 3 +++ src/normal.c | 3 +++ src/os_win32.c | 48 +++++++++++++++++++++++++++++++++++++++++------- src/proto/os_win32.pro | 1 + src/version.c | 2 ++ 5 files changed, 50 insertions(+), 7 deletions(-) (limited to 'src') 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 @@ -9852,6 +9852,9 @@ ex_redraw(exarg_T *eap) #ifdef FEAT_TITLE 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 @@ -779,6 +779,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 940, /**/ 939, /**/ -- cgit v1.2.1