diff options
Diffstat (limited to 'src/app/api.rs')
| -rw-r--r-- | src/app/api.rs | 41 |
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(), |
