?1004 Focus Events
Have the terminal tell the program when its window gains or loses the keyboard focus.
CSI ? 1004 h/l
- xterm
- Mouse Tracking
With CSI ? 1004 h set, the terminal sends CSI I to the program when its window gains the keyboard focus and CSI O when it loses it, so that an editor can, for instance, reload a file that changed while it was in the background. CSI ? 1004 l stops the reports. It is xterm’s, listed with the mouse tracking modes, but it can be set with or without any of them (dpmodes, SendFocusButton). It is off to begin with, and RIS turns it off.
Focus changes come from the window, not from the data a case writes, so the cases check what DECRQM says and that setting the mode sends nothing on its own. libghostty-vt passes them.
Support
| Terminal | Version | Support | Notes |
|---|---|---|---|
| VT220 | manual, 2nd ed., 1984 | No | not in the manual |
| VT510 | manual, 1st ed., 1993 | No | not in the manual; not in Table 5-6 |
| xterm | patch 412, xterm-411a | Yes | |
| libghostty-vt | 0f171f6 | Yes | |
| kitty | 0.49.1, run in a VM | Yes | passes the 3 cases that show it working |
| foot | 1.28.0, run in a VM | Partly | fails FOCUS-3, FOCUS-4 of the 3 cases that show it working |
| xterm.js headless | 6.0.0, run as a library | Yes | passes the 3 cases that show it working |
| alacritty_terminal | 0.26.0, run as a library | Yes | passes the 3 cases that show it working |
| ConEmu | build 230724, its documentation | Yes | listed among the mouse modes, as FOCUS_EVENT_MOUSE; ANSI escape codes |
| rxvt-unicode | 9.31, run in a VM | Partly | fails FOCUS-4 of the 3 cases that show it working |
| VTE | 0.84.1, run as a library | Partly | fails FOCUS-3, FOCUS-4 of the 3 cases that show it working |
Validation
FOCUS-1: Off to begin with
\e[?1004$p
|____|
reply \e[?1004;2$y
FOCUS-2: Setting it sends nothing
A
\e[?1004h
B
|AB__|
cursor 1,3
reply none
FOCUS-3: Set and reset
\e[?1004h
\e[?1004$p
\e[?1004l
\e[?1004$p
|____|
reply \e[?1004;1$y\e[?1004;2$y
FOCUS-4: RIS turns it off
\e[?1004h
\ec
\e[?1004$p
|____|
reply \e[?1004;2$y