diff options
| author | Can Celik <ogulcancelik@gmail.com> | 2026-04-05 02:24:57 +0300 |
|---|---|---|
| committer | Can Celik <ogulcancelik@gmail.com> | 2026-04-05 02:32:00 +0300 |
| commit | a08dfaef2f13873fc85dc9e1357235b8b0703a46 (patch) | |
| tree | a34a2ada492da80f5efe67eab08b34c3ca249a07 /src/app | |
| parent | 19239c6c87f190a38796b6d7a2e15620a97b70b7 (diff) | |
feat: forward ghostty pane focus events on focus changes
Diffstat (limited to 'src/app')
| -rw-r--r-- | src/app/input.rs | 3 | ||||
| -rw-r--r-- | src/app/mod.rs | 24 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/app/input.rs b/src/app/input.rs index d077909f..688a2a05 100644 --- a/src/app/input.rs +++ b/src/app/input.rs @@ -3366,6 +3366,7 @@ mod tests { alternate_screen: true, application_cursor: false, bracketed_paste: false, + focus_reporting: false, mouse_protocol_mode: vt100::MouseProtocolMode::ButtonMotion, mouse_protocol_encoding: vt100::MouseProtocolEncoding::Sgr, mouse_alternate_scroll: true, @@ -3380,6 +3381,7 @@ mod tests { alternate_screen: true, application_cursor: false, bracketed_paste: false, + focus_reporting: false, mouse_protocol_mode: vt100::MouseProtocolMode::None, mouse_protocol_encoding: vt100::MouseProtocolEncoding::Default, mouse_alternate_scroll: true, @@ -3394,6 +3396,7 @@ mod tests { alternate_screen: false, application_cursor: false, bracketed_paste: false, + focus_reporting: false, mouse_protocol_mode: vt100::MouseProtocolMode::None, mouse_protocol_encoding: vt100::MouseProtocolEncoding::Default, mouse_alternate_scroll: true, diff --git a/src/app/mod.rs b/src/app/mod.rs index 914c6ca4..b53024b1 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -738,7 +738,13 @@ impl App { return; } + #[cfg(feature = "ghostty-vt")] + if let Some((ws_idx, pane_id)) = self.last_focus { + self.send_pane_focus_event(ws_idx, pane_id, crate::ghostty::FocusEvent::Lost); + } if let Some((ws_idx, pane_id)) = current_focus { + #[cfg(feature = "ghostty-vt")] + self.send_pane_focus_event(ws_idx, pane_id, crate::ghostty::FocusEvent::Gained); self.emit_event(crate::api::schema::EventEnvelope { event: crate::api::schema::EventKind::WorkspaceFocused, data: crate::api::schema::EventData::WorkspaceFocused { @@ -770,6 +776,24 @@ impl App { self.last_focus = current_focus; } + #[cfg(feature = "ghostty-vt")] + fn send_pane_focus_event( + &self, + ws_idx: usize, + pane_id: crate::layout::PaneId, + event: crate::ghostty::FocusEvent, + ) { + let Some(runtime) = self + .state + .workspaces + .get(ws_idx) + .and_then(|ws| ws.runtime(pane_id)) + else { + return; + }; + runtime.try_send_focus_event(event); + } + fn find_pane( &self, pane_id: crate::layout::PaneId, |
