diff --git a/src/lib/app/mainapplication.cpp b/src/lib/app/mainapplication.cpp index a68aa0f85..d7c1dcf46 100644 --- a/src/lib/app/mainapplication.cpp +++ b/src/lib/app/mainapplication.cpp @@ -442,6 +442,8 @@ void MainApplication::openSession(BrowserWindow* window, RestoreData &restoreDat window->restoreWindow(data); } + m_closedWindowsManager->restoreState(restoreData.closedWindows); + restoreOverrideCursor(); } @@ -741,6 +743,8 @@ QByteArray MainApplication::saveState() const stream << m_restoreManager->restoreData(); } + restoreData.closedWindows = m_closedWindowsManager->saveState(); + QByteArray data; QDataStream stream(&data, QIODevice::WriteOnly); diff --git a/src/lib/session/restoremanager.cpp b/src/lib/session/restoremanager.cpp index da9a22577..8fd7aebb1 100644 --- a/src/lib/session/restoremanager.cpp +++ b/src/lib/session/restoremanager.cpp @@ -22,7 +22,7 @@ #include -static const int restoreDataVersion = 1; +static const int restoreDataVersion = 2; bool RestoreData::isValid() const { @@ -43,6 +43,7 @@ QDataStream &operator<<(QDataStream &stream, const RestoreData &data) stream << restoreDataVersion; stream << data.crashedSession; + stream << data.closedWindows; return stream; } @@ -66,6 +67,10 @@ QDataStream &operator>>(QDataStream &stream, RestoreData &data) stream >> data.crashedSession; } + if (version >= 2) { + stream >> data.closedWindows; + } + return stream; } diff --git a/src/lib/session/restoremanager.h b/src/lib/session/restoremanager.h index bc0f00286..6d89df66c 100644 --- a/src/lib/session/restoremanager.h +++ b/src/lib/session/restoremanager.h @@ -29,6 +29,7 @@ struct QUPZILLA_EXPORT RestoreData { QVector windows; QByteArray crashedSession; + QByteArray closedWindows; bool isValid() const; void clear(); diff --git a/src/lib/tools/closedwindowsmanager.cpp b/src/lib/tools/closedwindowsmanager.cpp index c846c1f8c..ceaf5486e 100644 --- a/src/lib/tools/closedwindowsmanager.cpp +++ b/src/lib/tools/closedwindowsmanager.cpp @@ -39,7 +39,7 @@ QVector ClosedWindowsManager::closedWindows() cons void ClosedWindowsManager::saveWindow(BrowserWindow *window) { - if (mApp->isPrivate() || !window->weView()) { + if (mApp->isPrivate() || mApp->windowCount() == 1 || !window->weView()) { return; } @@ -97,3 +97,49 @@ void ClosedWindowsManager::clearClosedWindows() { m_closedWindows.clear(); } + +static const int closedWindowsVersion = 1; + +QByteArray ClosedWindowsManager::saveState() const +{ + QByteArray data; + QDataStream stream(&data, QIODevice::WriteOnly); + + stream << closedWindowsVersion; + stream << m_closedWindows.count(); + + for (const Window &window : qAsConst(m_closedWindows)) { + stream << window.windowState; + } + + return data; +} + +void ClosedWindowsManager::restoreState(const QByteArray &state) +{ + QDataStream stream(state); + + int version; + stream >> version; + + if (version < 1) { + return; + } + + m_closedWindows.clear(); + + int windowCount; + stream >> windowCount; + m_closedWindows.reserve(windowCount); + + for (int i = 0; i < windowCount; ++i) { + Window window; + stream >> window.windowState; + if (!window.isValid()) { + continue; + } + window.icon = window.windowState.tabs.at(0).icon; + window.title = window.windowState.tabs.at(0).title; + m_closedWindows.append(window); + } +} diff --git a/src/lib/tools/closedwindowsmanager.h b/src/lib/tools/closedwindowsmanager.h index 0a37bf2cd..b76571ec4 100644 --- a/src/lib/tools/closedwindowsmanager.h +++ b/src/lib/tools/closedwindowsmanager.h @@ -50,6 +50,9 @@ public: // Takes window at given index Window takeClosedWindowAt(int index); + QByteArray saveState() const; + void restoreState(const QByteArray &state); + public slots: void restoreClosedWindow(); void restoreAllClosedWindows();