0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

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)
This commit is contained in:
Bram Moolenaar
2016-02-07 19:57:16 +01:00
parent 768ce2435a
commit 942d6b2268
5 changed files with 63 additions and 5 deletions

View File

@@ -8205,7 +8205,7 @@ static struct fst
#ifdef FEAT_JOB #ifdef FEAT_JOB
{"job_start", 1, 2, f_job_start}, {"job_start", 1, 2, f_job_start},
{"job_status", 1, 1, f_job_status}, {"job_status", 1, 1, f_job_status},
{"job_stop", 1, 1, f_job_stop}, {"job_stop", 1, 2, f_job_stop},
#endif #endif
{"join", 1, 2, f_join}, {"join", 1, 2, f_join},
{"jsdecode", 1, 1, f_jsdecode}, {"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; rettv->vval.v_job->jv_status = JOB_FAILED;
#ifndef USE_ARGV #ifndef USE_ARGV
ga_init2(&ga, 200); ga_init2(&ga, (int)sizeof(char*), 20);
#endif #endif
if (argvars[0].v_type == VAR_STRING) if (argvars[0].v_type == VAR_STRING)

View File

@@ -1262,9 +1262,9 @@
#endif #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 # define FEAT_JOB
#endif #endif

View File

@@ -4155,7 +4155,7 @@ mch_system_classic(char *cmd, int options)
si.cbReserved2 = 0; si.cbReserved2 = 0;
si.lpReserved2 = NULL; 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...? */ * When the "c:\\" is left out it works OK...? */
if (mch_windows95() if (mch_windows95()
&& (STRNICMP(cmd, "c:/command.com", 14) == 0 && (STRNICMP(cmd, "c:/command.com", 14) == 0
@@ -5032,6 +5032,59 @@ mch_call_shell(
return x; 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 #ifndef FEAT_GUI_W32

View File

@@ -40,6 +40,9 @@ void mch_set_shellsize(void);
void mch_new_shellsize(void); void mch_new_shellsize(void);
void mch_set_winsize_now(void); void mch_set_winsize_now(void);
int mch_call_shell(char_u *cmd, int options); 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_set_normal_colors(void);
void mch_write(char_u *s, int len); void mch_write(char_u *s, int len);
void mch_delay(long msec, int ignoreinput); void mch_delay(long msec, int ignoreinput);

View File

@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1283,
/**/ /**/
1282, 1282,
/**/ /**/