aboutsummaryrefslogtreecommitdiff
path: root/src/app/creation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/creation.rs')
-rw-r--r--src/app/creation.rs50
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,