0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.2.3761: focus change is not passed on to a terminal window

Problem:    Focus change is not passed on to a terminal window.
Solution:   If the current window is a terminal and focus events are enabled
            send a focus event escape sequence to the terminal.
This commit is contained in:
Bram Moolenaar
2021-12-08 22:13:38 +00:00
parent 48873aebc0
commit a48d4e44a2
7 changed files with 86 additions and 8 deletions

View File

@@ -1127,6 +1127,21 @@ get_tty_part(term_T *term UNUSED)
return PART_IN;
}
/*
* Read any vterm output and send it on the channel.
*/
static void
term_forward_output(term_T *term)
{
VTerm *vterm = term->tl_vterm;
char buf[KEY_BUF_LEN];
size_t curlen = vterm_output_read(vterm, buf, KEY_BUF_LEN);
if (curlen > 0)
channel_send(term->tl_job->jv_channel, get_tty_part(term),
(char_u *)buf, (int)curlen, NULL);
}
/*
* Write job output "msg[len]" to the vterm.
*/
@@ -1154,14 +1169,7 @@ term_write_job_output(term_T *term, char_u *msg_arg, size_t len_arg)
// flush vterm buffer when vterm responded to control sequence
if (prevlen != vterm_output_get_buffer_current(vterm))
{
char buf[KEY_BUF_LEN];
size_t curlen = vterm_output_read(vterm, buf, KEY_BUF_LEN);
if (curlen > 0)
channel_send(term->tl_job->jv_channel, get_tty_part(term),
(char_u *)buf, (int)curlen, NULL);
}
term_forward_output(term);
// this invokes the damage callbacks
vterm_screen_flush_damage(vterm_obtain_screen(vterm));
@@ -2490,6 +2498,23 @@ term_win_entered()
}
}
void
term_focus_change(int in_focus)
{
term_T *term = curbuf->b_term;
if (term != NULL && term->tl_vterm != NULL)
{
VTermState *state = vterm_obtain_state(term->tl_vterm);
if (in_focus)
vterm_state_focus_in(state);
else
vterm_state_focus_out(state);
term_forward_output(term);
}
}
/*
* vgetc() may not include CTRL in the key when modify_other_keys is set.
* Return the Ctrl-key value in that case.