summaryrefslogtreecommitdiff
path: root/src/app/session.rs
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-07 16:14:46 +0300
committerGitHub <noreply@github.com>2026-09-07 15:14:46 +0200
commite7d8220788b4fa7c266a1e4457591b694478771c (patch)
tree272303d74e0b58c11f9c0c434dae8335d3d06703 /src/app/session.rs
parent482818130407691154d1635d4029b95d0e730104 (diff)
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 <jonathan.liebig@gmail.com>
Diffstat (limited to 'src/app/session.rs')
-rw-r--r--src/app/session.rs29
1 files changed, 29 insertions, 0 deletions
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) {