aboutsummaryrefslogtreecommitdiff
path: root/src/app/api.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/api.rs')
-rw-r--r--src/app/api.rs41
1 files changed, 34 insertions, 7 deletions
diff --git a/src/app/api.rs b/src/app/api.rs
index c504b4c0..8470818e 100644
--- a/src/app/api.rs
+++ b/src/app/api.rs
@@ -93,7 +93,10 @@ impl App {
return Vec::new();
}
worktree_restore_failed = true;
- AppEvent::PaneDied { pane_id }
+ AppEvent::PaneDied {
+ pane_id,
+ exit_reason: crate::platform::ChildExitReason::Exited,
+ }
}
ev => ev,
};
@@ -164,7 +167,7 @@ impl App {
}
let mut worktree_restore_updates = Vec::new();
- if let AppEvent::PaneDied { pane_id } = &ev {
+ if let AppEvent::PaneDied { pane_id, .. } = &ev {
if self
.state
.popup_pane
@@ -224,7 +227,18 @@ impl App {
}
}
- let overlay_state = if let AppEvent::PaneDied { pane_id } = &ev {
+ let checkpointed_pane_exit = matches!(
+ &ev,
+ AppEvent::PaneDied {
+ pane_id,
+ exit_reason,
+ } if exit_reason.requires_session_checkpoint() && self.find_pane(*pane_id).is_some() && !self.overlay_panes.contains_key(pane_id)
+ );
+ if checkpointed_pane_exit {
+ self.checkpoint_session_before_pane_exit();
+ }
+
+ let overlay_state = if let AppEvent::PaneDied { pane_id, .. } = &ev {
self.overlay_panes.remove(pane_id).map(|overlay| {
let was_overlay_active =
self.state
@@ -248,7 +262,7 @@ impl App {
None
};
- if let AppEvent::PaneDied { pane_id } = &ev {
+ if let AppEvent::PaneDied { pane_id, .. } = &ev {
if let Some((ws_idx, _)) = self.find_pane(*pane_id) {
if let Some(public_pane_id) = self.public_pane_id(ws_idx, *pane_id) {
self.emit_event(crate::api::schema::EventEnvelope {
@@ -261,7 +275,7 @@ impl App {
}
}
}
- let pane_exit_layout_target = if let AppEvent::PaneDied { pane_id } = &ev {
+ let pane_exit_layout_target = if let AppEvent::PaneDied { pane_id, .. } = &ev {
self.find_pane(*pane_id).and_then(|(ws_idx, _)| {
self.layout_update_target_after_pane_removal(ws_idx, *pane_id)
})
@@ -301,6 +315,9 @@ impl App {
if update_ready.is_some() {
self.state.latest_release_notes = crate::release_notes::load_latest();
}
+ if checkpointed_pane_exit {
+ self.finish_checkpointed_pane_exit();
+ }
if let Some(agents) = manifest_update_agents {
self.reset_agent_detection_for_agents(&agents);
}
@@ -1968,6 +1985,7 @@ mod tests {
app.handle_internal_event(AppEvent::PaneDied {
pane_id: overlay_pane,
+ exit_reason: crate::platform::ChildExitReason::Exited,
});
let overlay_tab = &app.state.workspaces[0].tabs[0];
@@ -1994,7 +2012,10 @@ mod tests {
app.state.ensure_test_terminals();
let tab_id = app.public_tab_id(0, 0).unwrap();
- app.handle_internal_event(AppEvent::PaneDied { pane_id: dead_pane });
+ app.handle_internal_event(AppEvent::PaneDied {
+ pane_id: dead_pane,
+ exit_reason: crate::platform::ChildExitReason::Exited,
+ });
let events = event_hub.events_after(0);
let pane_exited = events
@@ -2143,6 +2164,7 @@ mod tests {
app.handle_internal_event(AppEvent::PaneDied {
pane_id: overlay_pane,
+ exit_reason: crate::platform::ChildExitReason::Exited,
});
let events = event_hub.events_after(0);
@@ -2168,6 +2190,7 @@ mod tests {
app.handle_internal_event(AppEvent::PaneDied {
pane_id: overlay_pane,
+ exit_reason: crate::platform::ChildExitReason::Exited,
});
let tab = &app.state.workspaces[0].tabs[0];
@@ -2187,6 +2210,7 @@ mod tests {
app.handle_internal_event(AppEvent::PaneDied {
pane_id: overlay_pane,
+ exit_reason: crate::platform::ChildExitReason::Exited,
});
let tab = &app.state.workspaces[0].tabs[0];
@@ -2226,7 +2250,10 @@ mod tests {
.expect("test session id should be valid"),
});
- app.handle_internal_event(AppEvent::PaneDied { pane_id });
+ app.handle_internal_event(AppEvent::PaneDied {
+ pane_id,
+ exit_reason: crate::platform::ChildExitReason::Exited,
+ });
assert!(
app.find_pane(pane_id).is_some(),