# HG changeset patch # User Christian Brabandt # Date 1443528904 -7200 # Node ID 46390681bd80f2e1fe061fc5e3b549d30e5390eb # Parent bc2327686917543b6a82b16d4c8e2941ce733659 commit https://github.com/vim/vim/commit/1d478a6242871dcf4566814d3c6208df17991426 Author: Bram Moolenaar Date: Tue Sep 29 14:01:12 2015 +0200 patch 7.4.886 Problem: Windows7: Switching screen buffer causes flicker when using system(). Solution: Instead of actually switching screen buffer, duplicate the handle. (Yasuhiro Matsumoto) diff --git a/src/os_win32.c b/src/os_win32.c --- 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; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 886, +/**/ 885, /**/ 884,