forked from aniani/vim
patch 8.0.0839: cannot kill a job in a terminal with CTRL-C
Problem: Cannot kill a job in a terminal with CTRL-C. Solution: Set the controlling tty and send SIGINT. (closes #1910)
This commit is contained in:
parent
94053a5125
commit
fae4283542
@ -4194,6 +4194,26 @@ open_pty(int *pty_master_fd, int *pty_slave_fd)
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Send SIGINT to a child process if "c" is an interrupt character.
|
||||
*/
|
||||
void
|
||||
may_send_sigint(int c UNUSED, pid_t pid UNUSED, pid_t wpid UNUSED)
|
||||
{
|
||||
# ifdef SIGINT
|
||||
if (c == Ctrl_C || c == intr_char)
|
||||
{
|
||||
# ifdef HAVE_SETSID
|
||||
kill(-pid, SIGINT);
|
||||
# else
|
||||
kill(0, SIGINT);
|
||||
# endif
|
||||
if (wpid > 0)
|
||||
kill(wpid, SIGINT);
|
||||
}
|
||||
# endif
|
||||
}
|
||||
|
||||
int
|
||||
mch_call_shell(
|
||||
char_u *cmd,
|
||||
@ -4765,23 +4785,12 @@ mch_call_shell(
|
||||
*/
|
||||
if (len == 1 && (pty_master_fd < 0 || cmd != NULL))
|
||||
{
|
||||
# ifdef SIGINT
|
||||
/*
|
||||
* Send SIGINT to the child's group or all
|
||||
* processes in our group.
|
||||
*/
|
||||
if (ta_buf[ta_len] == Ctrl_C
|
||||
|| ta_buf[ta_len] == intr_char)
|
||||
{
|
||||
# ifdef HAVE_SETSID
|
||||
kill(-pid, SIGINT);
|
||||
# else
|
||||
kill(0, SIGINT);
|
||||
# endif
|
||||
if (wpid > 0)
|
||||
kill(wpid, SIGINT);
|
||||
}
|
||||
# endif
|
||||
may_send_sigint(ta_buf[ta_len], pid, wpid);
|
||||
|
||||
if (pty_master_fd < 0 && toshell_fd >= 0
|
||||
&& ta_buf[ta_len] == Ctrl_D)
|
||||
{
|
||||
@ -5360,15 +5369,26 @@ mch_job_start(char **argv, job_T *job, jobopt_T *options)
|
||||
if (null_fd >= 0)
|
||||
close(null_fd);
|
||||
|
||||
if (pty_slave_fd >= 0)
|
||||
{
|
||||
/* push stream discipline modules */
|
||||
SetupSlavePTY(pty_slave_fd);
|
||||
# ifdef TIOCSCTTY
|
||||
/* Try to become controlling tty (probably doesn't work,
|
||||
* unless run by root) */
|
||||
ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL);
|
||||
# endif
|
||||
}
|
||||
|
||||
/* See above for type of argv. */
|
||||
execvp(argv[0], argv);
|
||||
|
||||
if (stderr_works)
|
||||
perror("executing job failed");
|
||||
#ifdef EXITFREE
|
||||
# ifdef EXITFREE
|
||||
/* calling free_all_mem() here causes problems. Ignore valgrind
|
||||
* reporting possibly leaked memory. */
|
||||
#endif
|
||||
# endif
|
||||
_exit(EXEC_FAILED); /* exec failed, return failure code */
|
||||
}
|
||||
|
||||
|
@ -57,6 +57,7 @@ int mch_report_winsize(int fd, int rows, int cols);
|
||||
void mch_set_shellsize(void);
|
||||
void mch_new_shellsize(void);
|
||||
int mch_parse_cmd(char_u *cmd, int use_shcf, char ***argv, int *argc);
|
||||
void may_send_sigint(int c, pid_t pid, pid_t wpid);
|
||||
int mch_call_shell(char_u *cmd, int options);
|
||||
void mch_job_start(char **argv, job_T *job, jobopt_T *options);
|
||||
char *mch_job_status(job_T *job);
|
||||
|
@ -39,8 +39,6 @@
|
||||
* - don't allow exiting Vim when a terminal is still running a job
|
||||
* - in bash mouse clicks are inserting characters.
|
||||
* - mouse scroll: when over other window, scroll that window.
|
||||
* - typing CTRL-C is not sent to the terminal. need to setup controlling tty?
|
||||
* #1910
|
||||
* - For the scrollback buffer store lines in the buffer, only attributes in
|
||||
* tl_scrollback.
|
||||
* - When the job ends:
|
||||
@ -962,6 +960,17 @@ terminal_loop(void)
|
||||
/* job finished while waiting for a character */
|
||||
break;
|
||||
|
||||
#ifdef UNIX
|
||||
may_send_sigint(c, curbuf->b_term->tl_job->jv_pid, 0);
|
||||
#endif
|
||||
#ifdef WIN3264
|
||||
if (c == Ctrl_C)
|
||||
/* We don't know if the job can handle CTRL-C itself or not, this
|
||||
* may kill the shell instead of killing the command running in the
|
||||
* shell. */
|
||||
mch_stop_job(curbuf->b_term->tl_job, "quit")
|
||||
#endif
|
||||
|
||||
if (c == (termkey == 0 ? Ctrl_W : termkey))
|
||||
{
|
||||
int prev_c = c;
|
||||
|
@ -769,6 +769,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
839,
|
||||
/**/
|
||||
838,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user