diff options
| author | Can Celik <ogulcancelik@gmail.com> | 2026-09-02 14:24:33 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-02 14:24:33 +0300 |
| commit | 6c0bb273d5d5405a00985621b17e36f8b4d64609 (patch) | |
| tree | ceef5ea8adf337bf3c1e977b133e76cb763c6f1b /src/app/api.rs | |
| parent | cc88b3b8e5bb9f7d9f23ed6ae85a52fd7b5b9ed6 (diff) | |
feat: support independent multi-client tab views (#3526)
Diffstat (limited to 'src/app/api.rs')
| -rw-r--r-- | src/app/api.rs | 81 |
1 files changed, 52 insertions, 29 deletions
diff --git a/src/app/api.rs b/src/app/api.rs index ff5a7dc4..e6f6b6ec 100644 --- a/src/app/api.rs +++ b/src/app/api.rs @@ -657,8 +657,56 @@ impl App { self.sync_focus_events_with_outer_event(None); } - pub(crate) fn send_outer_focus_event(&mut self, event: crate::ghostty::FocusEvent) { - self.sync_focus_events_with_outer_event(Some(event)); + pub(crate) fn accept_current_focus_without_events(&mut self) { + self.last_focus = self.state.active.and_then(|idx| { + self.state + .workspaces + .get(idx) + .and_then(|workspace| workspace.focused_pane_id().map(|pane_id| (idx, pane_id))) + }); + } + + pub(crate) fn accept_current_focus_with_api_events(&mut self) { + let current_focus = self.state.active.and_then(|idx| { + self.state + .workspaces + .get(idx) + .and_then(|workspace| workspace.focused_pane_id().map(|pane_id| (idx, pane_id))) + }); + if current_focus == self.last_focus { + return; + } + self.last_focus = current_focus; + if let Some((ws_idx, pane_id)) = current_focus { + self.emit_focus_api_events(ws_idx, pane_id); + } + } + + fn emit_focus_api_events(&mut self, ws_idx: usize, pane_id: crate::layout::PaneId) { + self.emit_event(crate::api::schema::EventEnvelope { + event: crate::api::schema::EventKind::WorkspaceFocused, + data: crate::api::schema::EventData::WorkspaceFocused { + workspace_id: self.public_workspace_id(ws_idx), + }, + }); + if let Some(tab_id) = self.public_tab_id(ws_idx, self.state.workspaces[ws_idx].active_tab) { + self.emit_event(crate::api::schema::EventEnvelope { + event: crate::api::schema::EventKind::TabFocused, + data: crate::api::schema::EventData::TabFocused { + tab_id, + workspace_id: self.public_workspace_id(ws_idx), + }, + }); + } + if let Some(public_pane_id) = self.public_pane_id(ws_idx, pane_id) { + self.emit_event(crate::api::schema::EventEnvelope { + event: crate::api::schema::EventKind::PaneFocused, + data: crate::api::schema::EventData::PaneFocused { + pane_id: public_pane_id, + workspace_id: self.public_workspace_id(ws_idx), + }, + }); + } } fn sync_focus_events_with_outer_event( @@ -690,38 +738,13 @@ impl App { } }); self.send_pane_focus_event(ws_idx, pane_id, event); - self.emit_event(crate::api::schema::EventEnvelope { - event: crate::api::schema::EventKind::WorkspaceFocused, - data: crate::api::schema::EventData::WorkspaceFocused { - workspace_id: self.public_workspace_id(ws_idx), - }, - }); - if let Some(tab_id) = - self.public_tab_id(ws_idx, self.state.workspaces[ws_idx].active_tab) - { - self.emit_event(crate::api::schema::EventEnvelope { - event: crate::api::schema::EventKind::TabFocused, - data: crate::api::schema::EventData::TabFocused { - tab_id, - workspace_id: self.public_workspace_id(ws_idx), - }, - }); - } - if let Some(public_pane_id) = self.public_pane_id(ws_idx, pane_id) { - self.emit_event(crate::api::schema::EventEnvelope { - event: crate::api::schema::EventKind::PaneFocused, - data: crate::api::schema::EventData::PaneFocused { - pane_id: public_pane_id, - workspace_id: self.public_workspace_id(ws_idx), - }, - }); - } + self.emit_focus_api_events(ws_idx, pane_id); } self.last_focus = current_focus; } - fn send_pane_focus_event( + pub(crate) fn send_pane_focus_event( &self, ws_idx: usize, pane_id: crate::layout::PaneId, |
