diff --git a/src/sessionmanager.cpp b/src/sessionmanager.cpp index 219a2d0..e73abd4 100644 --- a/src/sessionmanager.cpp +++ b/src/sessionmanager.cpp @@ -118,8 +118,15 @@ SessionManager::SessionManager(Settings *settings, QObject *parent) // save path returns early without arming the timer. Without this, that // content only flushes at aboutToQuit — and is lost if the app is killed first. connect(m_settings, &Settings::scrollbackPersistenceChanged, this, [this]() { - if (!m_settings->scrollbackPersistence() || !m_sessionsLoaded) + if (!m_settings->scrollbackPersistence()) { + // Purge all scrollback files immediately. Not gated on m_sessionsLoaded: + // files exist on disk regardless of session state (privacy expectation). + cleanupScrollbackFiles(true); return; + } + if (!m_sessionsLoaded) + return; + // Enabled — re-arm dirty sessions + schedule a save. bool any = false; for (SessionInfo &info : m_sessions) { if (info.view) { @@ -131,6 +138,14 @@ SessionManager::SessionManager(Settings *settings, QObject *parent) scheduleScrollbackSave(); }); + connect(m_settings, &Settings::scrollbackRetentionDaysChanged, this, [this]() { + // Reducing retention should purge now-overage files immediately. + // No-op when persistence is off (the disable handler already purged everything). + if (!m_settings->scrollbackPersistence()) + return; + cleanupScrollbackFiles(); // mtime-gated + }); + // Save sessions early on app quit — before QML engine destruction kills // the terminal views (and their shells), which would make /proc//cwd // unreadable. @@ -1043,7 +1058,7 @@ void SessionManager::saveScrollbackIncremental(bool force) scheduleScrollbackSave(); } -void SessionManager::cleanupScrollbackFiles() +void SessionManager::cleanupScrollbackFiles(bool purgeAll) { int retentionDays = m_settings->scrollbackRetentionDays(); QDir dir(scrollbackDir()); @@ -1055,7 +1070,7 @@ void SessionManager::cleanupScrollbackFiles() for (const QFileInfo &fi : files) { if (fi.fileName().startsWith(QStringLiteral("session_"))) { if (fi.fileName().endsWith(QStringLiteral(".vt"))) { - if (fi.lastModified() < cutoff) + if (purgeAll || fi.lastModified() < cutoff) QFile::remove(fi.absoluteFilePath()); } else { // Orphaned QSaveFile temp file from a crash during write. diff --git a/src/sessionmanager.h b/src/sessionmanager.h index 8ee501d..5377658 100644 --- a/src/sessionmanager.h +++ b/src/sessionmanager.h @@ -184,7 +184,7 @@ class SessionManager : public QObject // Scrollback persistence void saveScrollbackIncremental(bool force = false); void saveSessionScrollback(SessionInfo &info); - void cleanupScrollbackFiles(); + void cleanupScrollbackFiles(bool purgeAll = false); QString scrollbackDir() const; QString scrollbackFilePath(int sessionId) const;