# HG changeset patch # User Christian Brabandt # Date 1454871605 -3600 # Node ID 7224f5e9c36a4e5d94e2763c22c3845fcc181408 # Parent fe554d117c7bb0a16a0d2725842c805cf7f3b4b7 commit https://github.com/vim/vim/commit/942d6b22686858c9e72f8b8929df5c288170179c Author: Bram Moolenaar Date: Sun Feb 7 19:57:16 2016 +0100 patch 7.4.1283 Problem: The job feature isn't available on MS-Windows. Solution: Add the job feature. Fix argument of job_stop(). (Yasuhiro Matsumoto) diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -8205,7 +8205,7 @@ static struct fst #ifdef FEAT_JOB {"job_start", 1, 2, f_job_start}, {"job_status", 1, 1, f_job_status}, - {"job_stop", 1, 1, f_job_stop}, + {"job_stop", 1, 2, f_job_stop}, #endif {"join", 1, 2, f_join}, {"jsdecode", 1, 1, f_jsdecode}, @@ -14286,7 +14286,7 @@ f_job_start(typval_T *argvars UNUSED, ty rettv->vval.v_job->jv_status = JOB_FAILED; #ifndef USE_ARGV - ga_init2(&ga, 200); + ga_init2(&ga, (int)sizeof(char*), 20); #endif if (argvars[0].v_type == VAR_STRING) diff --git a/src/feature.h b/src/feature.h --- a/src/feature.h +++ b/src/feature.h @@ -1262,9 +1262,9 @@ #endif /* - * The +job feature requires Unix and +eval. + * The +job feature requires +eval and Unix or MS-Widndows. */ -#if defined(UNIX) && defined(FEAT_EVAL) +#if (defined(UNIX) || defined(WIN32)) && defined(FEAT_EVAL) # define FEAT_JOB #endif diff --git a/src/os_win32.c b/src/os_win32.c --- a/src/os_win32.c +++ b/src/os_win32.c @@ -4155,7 +4155,7 @@ mch_system_classic(char *cmd, int option si.cbReserved2 = 0; si.lpReserved2 = NULL; - /* There is a strange error on Windows 95 when using "c:\\command.com". + /* There is a strange error on Windows 95 when using "c:\command.com". * When the "c:\\" is left out it works OK...? */ if (mch_windows95() && (STRNICMP(cmd, "c:/command.com", 14) == 0 @@ -5032,6 +5032,59 @@ mch_call_shell( return x; } +#if defined(FEAT_JOB) || defined(PROTO) + void +mch_start_job(char *cmd, job_T *job) +{ + STARTUPINFO si; + PROCESS_INFORMATION pi; + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + + if (!vim_create_process(cmd, FALSE, + CREATE_DEFAULT_ERROR_MODE | + CREATE_NEW_PROCESS_GROUP | + CREATE_NO_WINDOW, + &si, &pi)) + job->jv_status = JOB_FAILED; + else + { + job->jf_pi = pi; + job->jv_status = JOB_STARTED; + } +} + + char * +mch_job_status(job_T *job) +{ + DWORD dwExitCode = 0; + + if (!GetExitCodeProcess(job->jf_pi.hProcess, &dwExitCode)) + return "dead"; + if (dwExitCode != STILL_ACTIVE) + { + CloseHandle(job->jf_pi.hProcess); + CloseHandle(job->jf_pi.hThread); + return "dead"; + } + return "run"; +} + + int +mch_stop_job(job_T *job, char_u *how) +{ + if (STRCMP(how, "kill") == 0) + TerminateProcess(job->jf_pi.hProcess, 0); + else + return GenerateConsoleCtrlEvent( + STRCMP(how, "hup") == 0 ? + CTRL_BREAK_EVENT : CTRL_C_EVENT, + job->jf_pi.dwProcessId) ? OK : FAIL; + return OK; +} +#endif + #ifndef FEAT_GUI_W32 diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro --- a/src/proto/os_win32.pro +++ b/src/proto/os_win32.pro @@ -40,6 +40,9 @@ void mch_set_shellsize(void); void mch_new_shellsize(void); void mch_set_winsize_now(void); int mch_call_shell(char_u *cmd, int options); +void mch_start_job(char *cmd, job_T *job); +char *mch_job_status(job_T *job); +int mch_stop_job(job_T *job, char_u *how); void mch_set_normal_colors(void); void mch_write(char_u *s, int len); void mch_delay(long msec, int ignoreinput); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -748,6 +748,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1283, +/**/ 1282, /**/ 1281,