aboutsummaryrefslogtreecommitdiff
path: root/src/app
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-04-05 02:24:57 +0300
committerCan Celik <ogulcancelik@gmail.com>2026-04-05 02:32:00 +0300
commita08dfaef2f13873fc85dc9e1357235b8b0703a46 (patch)
treea34a2ada492da80f5efe67eab08b34c3ca249a07 /src/app
parent19239c6c87f190a38796b6d7a2e15620a97b70b7 (diff)
feat: forward ghostty pane focus events on focus changes
Diffstat (limited to 'src/app')
-rw-r--r--src/app/input.rs3
-rw-r--r--src/app/mod.rs24
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,