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
 
 /**************************************
--- 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,