From e7d8220788b4fa7c266a1e4457591b694478771c Mon Sep 17 00:00:00 2001 From: Can Celik Date: Mon, 7 Sep 2026 16:14:46 +0300 Subject: fix: preserve sessions after interrupted pane exits (#3418) * fix: preserve sessions when pane shells are signaled refs #3415 * fix: preserve shutdown checkpoints across platforms refs #3415 --------- Co-authored-by: Jonathan Liebig --- src/app/session.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src/app/session.rs') diff --git a/src/app/session.rs b/src/app/session.rs index 07bc80a9..49dca914 100644 --- a/src/app/session.rs +++ b/src/app/session.rs @@ -13,6 +13,7 @@ enum SessionSaveJob { impl App { pub(super) fn schedule_session_save(&mut self) { if self.policy.persist_session { + self.pane_exit_checkpoint_pending = false; self.session_save_deadline = Some(Instant::now() + SESSION_SAVE_DEBOUNCE); } } @@ -67,6 +68,7 @@ impl App { } let job = self.capture_session_save_job(); + self.pane_exit_checkpoint_pending = false; self.session_save_deadline = None; match std::thread::Builder::new() .name("herdr-session-save".into()) @@ -91,8 +93,35 @@ impl App { } run_session_save_job(self.capture_session_save_job()); + self.pane_exit_checkpoint_pending = false; self.session_save_deadline = None; } + + pub(crate) fn checkpoint_session_before_pane_exit(&mut self) { + if !self.policy.persist_session + || (self.pane_exit_checkpoint_pending && !self.state.session_dirty) + { + return; + } + self.save_session_now(); + self.pane_exit_checkpoint_pending = true; + self.state.session_dirty = false; + } + + pub(crate) fn finish_checkpointed_pane_exit(&mut self) { + if self.pane_exit_checkpoint_pending { + self.state.session_dirty = false; + self.session_save_deadline = Some(Instant::now() + SESSION_SAVE_DEBOUNCE); + } + } + + pub(crate) fn save_session_on_shutdown(&mut self) { + if self.pane_exit_checkpoint_pending && !self.state.session_dirty { + self.session_save_deadline = None; + return; + } + self.save_session_now(); + } } fn run_session_save_job(job: SessionSaveJob) { -- cgit v1.2.3