diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-08-17 14:39:07 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-08-17 14:39:07 +0200 |
commit | a83e3962ac0e4bbfef15a072ad9a7390fc255409 (patch) | |
tree | 0593f07a82ffacfeba89d968264eac5c5adf7e2c | |
parent | 84ed4ad08486f85948d4fe10a47aa2e312699eb9 (diff) | |
download | vim-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.c | 6 | ||||
-rw-r--r-- | src/proto/terminal.pro | 1 | ||||
-rw-r--r-- | src/terminal.c | 33 | ||||
-rw-r--r-- | src/version.c | 2 |
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, |