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/testdir/dumps/Test_terminal_focus_1.dump b/src/testdir/dumps/Test_terminal_focus_1.dump
new file mode 100644
index 0000000..96fe303
--- /dev/null
+++ b/src/testdir/dumps/Test_terminal_focus_1.dump
@@ -0,0 +1,6 @@
+> +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|I+0#0000000&| |a|m| |l|o|s|t| @65
diff --git a/src/testdir/dumps/Test_terminal_focus_2.dump b/src/testdir/dumps/Test_terminal_focus_2.dump
new file mode 100644
index 0000000..b4e8f4c
--- /dev/null
+++ b/src/testdir/dumps/Test_terminal_focus_2.dump
@@ -0,0 +1,6 @@
+> +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|I+0#0000000&| |a|m| |b|a|c|k| @65
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index 8cdb42a..61b1458 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -1124,6 +1124,40 @@
unlet g:job
endfunc
+func Test_terminal_focus_events()
+ CheckNotGui
+ CheckUnix
+ CheckRunVimInTerminal
+
+ let save_term = &term
+ let save_ttymouse = &ttymouse
+ set term=xterm ttymouse=xterm2
+
+ let lines =<< trim END
+ set term=xterm ttymouse=xterm2
+ au FocusLost * echo 'I am lost'
+ au FocusGained * echo 'I am back'
+ " FIXME: sometimes this job hangs, exit after a couple of seconds
+ call timer_start(2000, {id -> execute('qall')})
+ END
+ call writefile(lines, 'XtermFocus')
+ let buf = RunVimInTerminal('-S XtermFocus', #{rows: 6})
+
+ " Send a focus event to ourselves, it should be forwarded to the terminal
+ call feedkeys("\<Esc>[O", "Lx!")
+ call TermWait(buf)
+ call VerifyScreenDump(buf, 'Test_terminal_focus_1', {})
+
+ call feedkeys("\<Esc>[I", "Lx!")
+ call TermWait(buf)
+ call VerifyScreenDump(buf, 'Test_terminal_focus_2', {})
+
+ call StopVimInTerminal(buf)
+ call delete('XtermFocus')
+ let &term = save_term
+ let &ttymouse = save_ttymouse
+endfunc
+
" Run Vim, start a terminal in that Vim with the kill argument,
" :qall works.
func Run_terminal_qall_kill(line1, line2)