summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/eval.c4
-rw-r--r--src/feature.h4
-rw-r--r--src/os_win32.c55
-rw-r--r--src/proto/os_win32.pro3
-rw-r--r--src/version.c2
5 files changed, 63 insertions, 5 deletions
diff --git a/src/eval.c b/src/eval.c
index 4b1250b593..c2d18aa869 100644
--- 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, typval_T *rettv)
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
index 19425ed355..e1f8e27b78 100644
--- 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
index db080e44ec..4917a7f53f 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -4155,7 +4155,7 @@ mch_system_classic(char *cmd, int options)
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
index a5d4c77b4b..2128807ce5 100644
--- 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
index ffa3346a2e..dab9368fc9 100644
--- 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,