diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-28 01:05:33 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-28 01:05:33 +0300 |
| commit | b6308ef3bec7ebd46ac830b3d36910171e94edf2 (patch) | |
| tree | 634866d39a3c98f0973d0f08c3da5018d051e337 /src/raw_input.rs | |
| parent | 5a61ae2f9d89320c2e91d58fc3646b5a6a88f44a (diff) | |
feat: notify active panes when terminal is unfocused
Diffstat (limited to 'src/raw_input.rs')
| -rw-r--r-- | src/raw_input.rs | 19 |
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"); |
