]> granicus.if.org Git - vim/commitdiff
patch 8.0.0952: has('terminal') does not check existence of dll file v8.0.0952
authorBram Moolenaar <Bram@vim.org>
Thu, 17 Aug 2017 12:39:07 +0000 (14:39 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 17 Aug 2017 12:39:07 +0000 (14:39 +0200)
Problem:    MS-Windows: has('terminal') does not check existence of dll file.
Solution:   Check if the winpty dll file can be loaded. (Ken Takata)

src/evalfunc.c
src/proto/terminal.pro
src/terminal.c
src/version.c

index 452183594f2fc4b68d8e9932ed8f595c07a39044..c85c334c82f13b5c929729d7fe46f201e608a7a8 100644 (file)
@@ -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
@@ -6133,6 +6133,10 @@ f_has(typval_T *argvars, typval_T *rettv)
 #ifdef FEAT_NETBEANS_INTG
        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
     }
 
index 8f2bcd5c6c48fca99d06eeeaf0a9398d35ff702a..2b05d341e2a2f208f823171c899227c5e6370f9a 100644 (file)
@@ -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 : */
index c4fa847677fd7f443bff19361597b482cf4d0075..d482d19525fa99525eef230f98ce8f0dc14daecc 100644 (file)
@@ -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
 
 /**************************************
index 5abfd173b7f20390c8333b77d948c1f025a5c328..545204cf16b64b2d3263a9195f71a549777392b4 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    952,
 /**/
     951,
 /**/