Mercurial > vim
changeset 7150:46390681bd80 v7.4.886
commit https://github.com/vim/vim/commit/1d478a6242871dcf4566814d3c6208df17991426
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 29 Sep 2015 14:15:04 +0200 |
parents | bc2327686917 |
children | 68143a4e27e7 |
files | src/os_win32.c src/version.c |
diffstat | 2 files changed, 24 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- 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; }