summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-08-17 14:39:07 +0200
committerBram Moolenaar <Bram@vim.org>2017-08-17 14:39:07 +0200
commita83e3962ac0e4bbfef15a072ad9a7390fc255409 (patch)
tree0593f07a82ffacfeba89d968264eac5c5adf7e2c
parent84ed4ad08486f85948d4fe10a47aa2e312699eb9 (diff)
downloadvim-git-a83e3962ac0e4bbfef15a072ad9a7390fc255409.tar.gz
patch 8.0.0952: has('terminal') does not check existence of dll filev8.0.0952
Problem: MS-Windows: has('terminal') does not check existence of dll file. Solution: Check if the winpty dll file can be loaded. (Ken Takata)
-rw-r--r--src/evalfunc.c6
-rw-r--r--src/proto/terminal.pro1
-rw-r--r--src/terminal.c33
-rw-r--r--src/version.c2
4 files changed, 31 insertions, 11 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 452183594..c85c334c8 100644
--- 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
index 8f2bcd5c6..2b05d341e 100644
--- a/src/proto/terminal.pro
+++ b/src/proto/terminal.pro
@@ -34,4 +34,5 @@ void f_term_scrape(typval_T *argvars, typval_T *rettv);
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 c4fa84767..d482d1952 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -2709,12 +2709,14 @@ f_term_wait(typval_T *argvars, typval_T *rettv UNUSED)
}
}
-# 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;
+# endif
- int
-dyn_winpty_init(void)
+ 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, int cols, typval_T *argvar, jobopt_T *
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 rows, int cols)
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 5abfd173b..545204cf1 100644
--- 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,