diff options
Diffstat (limited to 'src/os_win32.c')
-rw-r--r-- | src/os_win32.c | 30 |
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; } |