summaryrefslogtreecommitdiff
path: root/src/os_win32.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/os_win32.c')
-rw-r--r--src/os_win32.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/os_win32.c b/src/os_win32.c
index 6981d2f31..5114863fa 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -4612,20 +4612,34 @@ mch_system1(char *cmd, int options)
mch_system(char *cmd, int options)
{
int ret;
+ HANDLE hTemp = INVALID_HANDLE_VALUE;
/*
- * Restore non-termcap screen buffer before execute external program, and
- * revert it after. Because msys and msys2's programs will cause freeze
- * or crash conhost.exe (Windows's console window provider) and vim.exe,
- * if active screen buffer is vim's one on Windows7.
+ * Call DuplicateHandle before executing an external program, because msys
+ * and msys2's programs will call CreateConsoleScreenBuffer and
+ * CloseHandle. CreateConsoleScreenBuffer returns the same handle which
+ * created by vim. This causes a crash. This workaround is required on
+ * Windows7.
*/
- if (is_win7 && g_fTermcapMode)
- SetConsoleActiveScreenBuffer(g_cbNonTermcap.handle);
+ if (is_win7
+ && g_fTermcapMode
+ && DuplicateHandle(
+ GetCurrentProcess(),
+ g_hConOut,
+ GetCurrentProcess(),
+ &hTemp,
+ 0,
+ TRUE,
+ DUPLICATE_SAME_ACCESS))
+ SetConsoleActiveScreenBuffer(hTemp);
ret = mch_system1(cmd, options);
- if (is_win7 && g_fTermcapMode)
- SetConsoleActiveScreenBuffer(g_cbTermcap.handle);
+ if (hTemp != INVALID_HANDLE_VALUE)
+ {
+ SetConsoleActiveScreenBuffer(g_hConOut);
+ CloseHandle(hTemp);
+ }
return ret;
}