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.
diff --git a/src/terminal.c b/src/terminal.c
index 4a95a3e..c3ce116 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -1128,6 +1128,21 @@
}
/*
+ * 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.
*/
static void
@@ -1154,14 +1169,7 @@
// 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 @@
}
}
+ 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.