# HG changeset patch # User Christian Brabandt # Date 1502973904 -7200 # Node ID abd69cea3459a02991868953fb7f25887f5d708d # Parent 9af04854550dd0ae9846dd74187b719bcd17f01d patch 8.0.0952: has('terminal') does not check existence of dll file commit https://github.com/vim/vim/commit/a83e3962ac0e4bbfef15a072ad9a7390fc255409 Author: Bram Moolenaar Date: Thu Aug 17 14:39:07 2017 +0200 patch 8.0.0952: has('terminal') does not check existence of dll file Problem: MS-Windows: has('terminal') does not check existence of dll file. Solution: Check if the winpty dll file can be loaded. (Ken Takata) diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -5926,7 +5926,7 @@ f_has(typval_T *argvars, typval_T *rettv #ifdef FEAT_TERMGUICOLORS "termguicolors", #endif -#ifdef FEAT_TERMINAL +#if defined(FEAT_TERMINAL) && !defined(WIN3264) "terminal", #endif #ifdef TERMINFO @@ -6134,6 +6134,10 @@ f_has(typval_T *argvars, typval_T *rettv else if (STRICMP(name, "netbeans_enabled") == 0) n = netbeans_active(); #endif +#if defined(FEAT_TERMINAL) && defined(WIN3264) + else if (STRICMP(name, "terminal") == 0) + n = terminal_enabled(); +#endif } rettv->vval.v_number = n; diff --git a/src/proto/terminal.pro b/src/proto/terminal.pro --- a/src/proto/terminal.pro +++ b/src/proto/terminal.pro @@ -34,4 +34,5 @@ void f_term_scrape(typval_T *argvars, ty void f_term_sendkeys(typval_T *argvars, typval_T *rettv); void f_term_start(typval_T *argvars, typval_T *rettv); void f_term_wait(typval_T *argvars, typval_T *rettv); +int terminal_enabled(void); /* vim: set ft=c : */ diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -2709,12 +2709,14 @@ f_term_wait(typval_T *argvars, typval_T } } -# ifdef WIN3264 +# if defined(WIN3264) || defined(PROTO) /************************************** * 2. MS-Windows implementation. */ +# ifndef PROTO + #define WINPTY_SPAWN_FLAG_AUTO_SHUTDOWN 1ul #define WINPTY_SPAWN_FLAG_EXIT_AFTER_SHUTDOWN 2ull @@ -2737,9 +2739,10 @@ HANDLE (*winpty_agent_process)(void*); #define WINPTY_DLL "winpty.dll" static HINSTANCE hWinPtyDLL = NULL; - - int -dyn_winpty_init(void) +# endif + + static int +dyn_winpty_init(int verbose) { int i; static struct @@ -2768,7 +2771,7 @@ dyn_winpty_init(void) /* No need to initialize twice. */ if (hWinPtyDLL) - return 1; + return OK; /* Load winpty.dll, prefer using the 'winptydll' option, fall back to just * winpty.dll. */ if (*p_winptydll != NUL) @@ -2777,8 +2780,10 @@ dyn_winpty_init(void) hWinPtyDLL = vimLoadLib(WINPTY_DLL); if (!hWinPtyDLL) { - EMSG2(_(e_loadlib), *p_winptydll != NUL ? p_winptydll : WINPTY_DLL); - return 0; + if (verbose) + EMSG2(_(e_loadlib), *p_winptydll != NUL ? p_winptydll + : (char_u *)WINPTY_DLL); + return FAIL; } for (i = 0; winpty_entry[i].name != NULL && winpty_entry[i].ptr != NULL; ++i) @@ -2786,12 +2791,13 @@ dyn_winpty_init(void) if ((*winpty_entry[i].ptr = (FARPROC)GetProcAddress(hWinPtyDLL, winpty_entry[i].name)) == NULL) { - EMSG2(_(e_loadfunc), winpty_entry[i].name); - return 0; + if (verbose) + EMSG2(_(e_loadfunc), winpty_entry[i].name); + return FAIL; } } - return 1; + return OK; } /* @@ -2813,7 +2819,7 @@ term_and_job_init(term_T *term, int rows garray_T ga; char_u *cmd; - if (!dyn_winpty_init()) + if (dyn_winpty_init(TRUE) == FAIL) return FAIL; if (argvar->v_type == VAR_STRING) @@ -2977,6 +2983,13 @@ term_report_winsize(term_T *term, int ro winpty_set_size(term->tl_winpty, cols, rows, NULL); } + int +terminal_enabled(void) +{ + return dyn_winpty_init(FALSE) == OK; +} + + # else /************************************** diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -770,6 +770,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 952, +/**/ 951, /**/ 950,