mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 7.4.1878
Problem: Whether a job has exited isn't detected until a character is typed. After calling exit_cb the cursor is in the wrong place. Solution: Don't wait forever for a character to be typed when there is a pending job. Update the screen if neede after calling exit_cb.
This commit is contained in:
parent
01d46e41ba
commit
cf7c11a947
@ -4402,6 +4402,21 @@ job_stop_on_exit()
|
|||||||
mch_stop_job(job, job->jv_stoponexit);
|
mch_stop_job(job, job->jv_stoponexit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE when there is any job that might exit, which means
|
||||||
|
* job_check_ended() should be called once in a while.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
has_pending_job()
|
||||||
|
{
|
||||||
|
job_T *job;
|
||||||
|
|
||||||
|
for (job = first_job; job != NULL; job = job->jv_next)
|
||||||
|
if (job->jv_status == JOB_STARTED && job_still_useful(job))
|
||||||
|
return TRUE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called once in a while: check if any jobs that seem useful have ended.
|
* Called once in a while: check if any jobs that seem useful have ended.
|
||||||
*/
|
*/
|
||||||
@ -4425,6 +4440,11 @@ job_check_ended(void)
|
|||||||
job_status(job); /* may free "job" */
|
job_status(job); /* may free "job" */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (channel_need_redraw)
|
||||||
|
{
|
||||||
|
channel_need_redraw = FALSE;
|
||||||
|
redraw_after_callback();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -4658,6 +4678,7 @@ job_status(job_T *job)
|
|||||||
job->jv_exit_partial, NULL);
|
job->jv_exit_partial, NULL);
|
||||||
clear_tv(&rettv);
|
clear_tv(&rettv);
|
||||||
--job->jv_refcount;
|
--job->jv_refcount;
|
||||||
|
channel_need_redraw = TRUE;
|
||||||
}
|
}
|
||||||
if (job->jv_status == JOB_ENDED && job->jv_refcount == 0)
|
if (job->jv_status == JOB_ENDED && job->jv_refcount == 0)
|
||||||
{
|
{
|
||||||
|
@ -438,17 +438,31 @@ mch_inchar(
|
|||||||
|
|
||||||
for (;;) /* repeat until we got a character */
|
for (;;) /* repeat until we got a character */
|
||||||
{
|
{
|
||||||
|
long wtime_now = -1L;
|
||||||
|
|
||||||
while (do_resize) /* window changed size */
|
while (do_resize) /* window changed size */
|
||||||
handle_resize();
|
handle_resize();
|
||||||
|
|
||||||
#ifdef MESSAGE_QUEUE
|
#ifdef MESSAGE_QUEUE
|
||||||
parse_queued_messages();
|
parse_queued_messages();
|
||||||
|
|
||||||
|
# ifdef FEAT_JOB_CHANNEL
|
||||||
|
if (has_pending_job())
|
||||||
|
{
|
||||||
|
/* Don't wait longer than a few seconds, checking for a finished
|
||||||
|
* job requires polling. */
|
||||||
|
if (p_ut > 9000L)
|
||||||
|
wtime_now = 1000L;
|
||||||
|
else
|
||||||
|
wtime_now = 10000L - p_ut;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
* We want to be interrupted by the winch signal
|
* We want to be interrupted by the winch signal
|
||||||
* or by an event on the monitored file descriptors.
|
* or by an event on the monitored file descriptors.
|
||||||
*/
|
*/
|
||||||
if (!WaitForChar(-1L))
|
if (!WaitForChar(wtime_now))
|
||||||
{
|
{
|
||||||
if (do_resize) /* interrupted by SIGWINCH signal */
|
if (do_resize) /* interrupted by SIGWINCH signal */
|
||||||
handle_resize();
|
handle_resize();
|
||||||
|
@ -57,6 +57,7 @@ int free_unused_jobs_contents(int copyID, int mask);
|
|||||||
void free_unused_jobs(int copyID, int mask);
|
void free_unused_jobs(int copyID, int mask);
|
||||||
void job_set_options(job_T *job, jobopt_T *opt);
|
void job_set_options(job_T *job, jobopt_T *opt);
|
||||||
void job_stop_on_exit(void);
|
void job_stop_on_exit(void);
|
||||||
|
int has_pending_job(void);
|
||||||
void job_check_ended(void);
|
void job_check_ended(void);
|
||||||
job_T *job_start(typval_T *argvars);
|
job_T *job_start(typval_T *argvars);
|
||||||
char *job_status(job_T *job);
|
char *job_status(job_T *job);
|
||||||
|
@ -753,6 +753,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 */
|
||||||
|
/**/
|
||||||
|
1878,
|
||||||
/**/
|
/**/
|
||||||
1877,
|
1877,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user