diff options
Diffstat (limited to 'src/app/creation.rs')
| -rw-r--r-- | src/app/creation.rs | 50 |
1 files changed, 33 insertions, 17 deletions
diff --git a/src/app/creation.rs b/src/app/creation.rs index 6e557066..1832e637 100644 --- a/src/app/creation.rs +++ b/src/app/creation.rs @@ -78,13 +78,17 @@ impl App { }; let (rows, cols) = self.state.estimate_pane_size(); let ws = &mut self.state.workspaces[ws_idx]; - let idx = ws.create_tab( + let (idx, terminal, runtime) = ws.create_tab( rows, cols, initial_cwd, self.state.pane_scrollback_limit_bytes, self.state.host_terminal_theme, )?; + self.state + .terminal_runtimes + .insert(terminal.id.clone(), runtime); + self.state.terminals.insert(terminal.id.clone(), terminal); if focus { ws.switch_tab(idx); self.state.mode = Mode::Terminal; @@ -105,7 +109,7 @@ impl App { focus: bool, ) -> std::io::Result<usize> { let (rows, cols) = self.state.estimate_pane_size(); - let ws = Workspace::new( + let (ws, terminal, runtime) = Workspace::new( initial_cwd, rows, cols, @@ -115,6 +119,10 @@ impl App { self.render_notify.clone(), self.render_dirty.clone(), )?; + self.state + .terminal_runtimes + .insert(terminal.id.clone(), runtime); + self.state.terminals.insert(terminal.id.clone(), terminal); self.state.workspaces.push(ws); let idx = self.state.workspaces.len() - 1; let workspace_id = self.state.workspaces[idx].id.clone(); @@ -177,7 +185,12 @@ impl App { let (agg_state, seen) = tab .panes .values() - .map(|pane| (pane.state, pane.seen)) + .filter_map(|pane| { + self.state + .terminals + .get(&pane.attached_terminal_id) + .map(|terminal| (terminal.state, pane.seen)) + }) .max_by_key(|(state, seen)| tab_attention_priority(*state, *seen)) .unwrap_or((crate::detect::AgentState::Unknown, true)); Some(crate::api::schema::TabInfo { @@ -230,6 +243,7 @@ impl App { ) -> Option<crate::api::schema::PaneInfo> { let ws = self.state.workspaces.get(ws_idx)?; let pane = ws.pane_state(pane_id)?; + let terminal = self.state.terminals.get(&pane.attached_terminal_id)?; let tab_idx = ws.find_tab_index_for_pane(pane_id)?; let focused = self.state.active == Some(ws_idx) && ws.active_tab == tab_idx @@ -238,18 +252,22 @@ impl App { .is_some_and(|focused| focused == pane_id); Some(crate::api::schema::PaneInfo { pane_id: self.public_pane_id(ws_idx, pane_id)?, - terminal_id: ws.terminal_id(pane_id)?.to_string(), + terminal_id: terminal.id.to_string(), workspace_id: self.public_workspace_id(ws_idx), tab_id: self.public_tab_id(ws_idx, tab_idx)?, focused, cwd: ws.tabs[tab_idx] - .cwd_for_pane(pane_id) + .cwd_for_pane( + pane_id, + &self.state.terminals, + &self.state.terminal_runtimes, + ) .map(|cwd| cwd.display().to_string()), - label: pane.manual_label.clone(), - agent: pane.effective_agent_label().map(str::to_string), - agent_status: pane_agent_status(pane.state, pane.seen), - custom_status: pane.effective_custom_status().map(str::to_string), - revision: 0, + label: terminal.manual_label.clone(), + agent: terminal.effective_agent_label().map(str::to_string), + agent_status: pane_agent_status(terminal.state, pane.seen), + custom_status: terminal.effective_custom_status().map(str::to_string), + revision: terminal.revision, }) } @@ -257,9 +275,8 @@ impl App { &self, ws_idx: usize, pane_id: crate::layout::PaneId, - ) -> Option<(&crate::pane::PaneRuntime, String)> { - let ws = self.state.workspaces.get(ws_idx)?; - let runtime = ws.runtime(pane_id)?; + ) -> Option<(&crate::terminal::TerminalRuntime, String)> { + let runtime = self.state.runtime_for_pane_in_workspace(ws_idx, pane_id)?; Some((runtime, self.public_workspace_id(ws_idx))) } @@ -267,14 +284,13 @@ impl App { &self, ws_idx: usize, pane_id: crate::layout::PaneId, - ) -> Option<&crate::pane::PaneRuntime> { - let ws = self.state.workspaces.get(ws_idx)?; - ws.runtime(pane_id) + ) -> Option<&crate::terminal::TerminalRuntime> { + self.state.runtime_for_pane_in_workspace(ws_idx, pane_id) } pub(super) fn workspace_info(&self, index: usize) -> crate::api::schema::WorkspaceInfo { let ws = &self.state.workspaces[index]; - let (agg_state, seen) = ws.aggregate_state(); + let (agg_state, seen) = ws.aggregate_state(&self.state.terminals); crate::api::schema::WorkspaceInfo { workspace_id: self.public_workspace_id(index), number: index + 1, |
