aboutsummaryrefslogtreecommitdiff
path: root/src/raw_input.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-04-28 01:05:33 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-04-28 01:05:33 +0300
commitb6308ef3bec7ebd46ac830b3d36910171e94edf2 (patch)
tree634866d39a3c98f0973d0f08c3da5018d051e337 /src/raw_input.rs
parent5a61ae2f9d89320c2e91d58fc3646b5a6a88f44a (diff)
feat: notify active panes when terminal is unfocused
Diffstat (limited to 'src/raw_input.rs')
-rw-r--r--src/raw_input.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/raw_input.rs b/src/raw_input.rs
index a98cf25d..c2a412b2 100644
--- a/src/raw_input.rs
+++ b/src/raw_input.rs
@@ -125,6 +125,8 @@ pub enum RawInputEvent {
Key(TerminalKey),
Paste(String),
Mouse(MouseEvent),
+ OuterFocusGained,
+ OuterFocusLost,
HostDefaultColor {
kind: DefaultColorKind,
color: RgbColor,
@@ -297,6 +299,12 @@ fn extract_one_event(buffer: &[u8]) -> Option<(RawInputEvent, usize)> {
return Some((RawInputEvent::HostDefaultColor { kind, color }, seq_len));
}
+ match seq {
+ "\x1b[I" => return Some((RawInputEvent::OuterFocusGained, seq_len)),
+ "\x1b[O" => return Some((RawInputEvent::OuterFocusLost, seq_len)),
+ _ => {}
+ }
+
if let Some(mouse) = parse_sgr_mouse(seq) {
return Some((RawInputEvent::Mouse(mouse), seq_len));
}
@@ -604,6 +612,17 @@ mod tests {
}
#[test]
+ fn parses_outer_focus_events() {
+ let (event, consumed) = extract_one_event(b"\x1b[I").unwrap();
+ assert_eq!(consumed, 3);
+ assert!(matches!(event, RawInputEvent::OuterFocusGained));
+
+ let (event, consumed) = extract_one_event(b"\x1b[O").unwrap();
+ assert_eq!(consumed, 3);
+ assert!(matches!(event, RawInputEvent::OuterFocusLost));
+ }
+
+ #[test]
fn parses_xterm_alt_up_arrow() {
let (RawInputEvent::Key(key), consumed) = extract_one_event(b"\x1b[1;3A").unwrap() else {
panic!("expected key");