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
index 4521835..c85c334 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -5926,7 +5926,7 @@
#ifdef FEAT_TERMGUICOLORS
"termguicolors",
#endif
-#ifdef FEAT_TERMINAL
+#if defined(FEAT_TERMINAL) && !defined(WIN3264)
"terminal",
#endif
#ifdef TERMINFO
@@ -6134,6 +6134,10 @@
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
index 8f2bcd5..2b05d34 100644
--- a/src/proto/terminal.pro
+++ b/src/proto/terminal.pro
@@ -34,4 +34,5 @@
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
index c4fa847..d482d19 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -2709,12 +2709,14 @@
}
}
-# 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 @@
#define WINPTY_DLL "winpty.dll"
static HINSTANCE hWinPtyDLL = NULL;
+# endif
- int
-dyn_winpty_init(void)
+ static int
+dyn_winpty_init(int verbose)
{
int i;
static struct
@@ -2768,7 +2771,7 @@
/* 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 @@
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 @@
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 @@
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 @@
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
index 5abfd17..545204c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 952,
+/**/
951,
/**/
950,