# HG changeset patch # User Christian Brabandt # Date 1443187804 -7200 # Node ID aaf96b1aa605f746aad18a1c630cbb1af92f349d # Parent 7a0c929227e54f4d246a22b6e74d5250499ed53c commit https://github.com/vim/vim/commit/b0262f239e77480f81fa3345491b7b6d52a17f6d Author: Bram Moolenaar Date: Fri Sep 25 15:28:38 2015 +0200 patch 7.4.876 Problem: Windows7: when using vim.exe with msys or msys2, conhost.exe (console window provider on Windows7) will freeze or crash. Solution: Make original screen buffer active, before executing external program. And when the program is finished, revert to vim's one. (Taro Muraoka) diff --git a/src/os_win32.c b/src/os_win32.c --- a/src/os_win32.c +++ b/src/os_win32.c @@ -234,6 +234,7 @@ static int suppress_winsize = 1; /* don' static char_u *exe_path = NULL; +static BOOL is_win7 = FALSE; static BOOL win8_or_later = FALSE; /* @@ -680,6 +681,9 @@ PlatformId(void) g_PlatformId = ovi.dwPlatformId; + if ((ovi.dwMajorVersion == 6 && ovi.dwMinorVersion == 1)) + is_win7 = TRUE; + if ((ovi.dwMajorVersion == 6 && ovi.dwMinorVersion >= 2) || ovi.dwMajorVersion > 6) win8_or_later = TRUE; @@ -4581,11 +4585,12 @@ mch_system(char *cmd, int options) else return mch_system_classic(cmd, options); } + #else # ifdef FEAT_MBYTE static int -mch_system(char *cmd, int options) +mch_system1(char *cmd, int options) { if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) { @@ -4600,9 +4605,31 @@ mch_system(char *cmd, int options) return system(cmd); } # else -# define mch_system(c, o) system(c) +# define mch_system1(c, o) system(c) # endif + static int +mch_system(char *cmd, int options) +{ + int ret; + + /* + * 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. + */ + if (is_win7 && g_fTermcapMode) + SetConsoleActiveScreenBuffer(g_cbNonTermcap.handle); + + ret = mch_system1(cmd, options); + + if (is_win7 && g_fTermcapMode) + SetConsoleActiveScreenBuffer(g_cbTermcap.handle); + + return ret; +} + #endif /* 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 */ /**/ + 876, +/**/ 875, /**/ 874,