Mercurial > vim
changeset 12144:abd69cea3459 v8.0.0952
patch 8.0.0952: has('terminal') does not check existence of dll file
commit https://github.com/vim/vim/commit/a83e3962ac0e4bbfef15a072ad9a7390fc255409
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 17 Aug 2017 14:45:04 +0200 |
parents | 9af04854550d |
children | e3d303c068fc |
files | src/evalfunc.c src/proto/terminal.pro src/terminal.c src/version.c |
diffstat | 4 files changed, 32 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- 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;
--- 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 : */
--- 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 /**************************************