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