0
0
mirror of https://github.com/vim/vim.git synced 2025-09-29 04:34:16 -04:00

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)
This commit is contained in:
Bram Moolenaar
2015-09-29 14:01:12 +02:00
parent c79a5452ac
commit 1d478a6242
2 changed files with 24 additions and 8 deletions

View File

@@ -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;
}