summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-02-17 15:00:52 +0100
committerBram Moolenaar <Bram@vim.org>2019-02-17 15:00:52 +0100
commit78d21dae9c3a39efb30316d3e38dce120bc1abbd (patch)
tree5357adccfdb180cd25ea87b895bd067aa89c2ef5 /src
parent3678f65d43d10b36dc62738aab2f341fa1e18a32 (diff)
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.c3
-rw-r--r--src/normal.c3
-rw-r--r--src/os_win32.c48
-rw-r--r--src/proto/os_win32.pro1
-rw-r--r--src/version.c2
5 files changed, 50 insertions, 7 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index ccca2f98fa..8cdb046747 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 624e34751c..ca0d8ff876 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 97fc2a401b..a392d13b27 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 6157e011fd..ca5bad629c 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 06500bd790..e042578cca 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,