From 62f448faf202a5a174f0e0bb3d3a80f3109d234f Mon Sep 17 00:00:00 2001 From: Stefan Becker Date: Sat, 9 May 2015 17:16:27 +0300 Subject: [PATCH] Add 2nd variant for KConfigGui::sessionConfig() When application receives a saveState signal it needs to get a KConfig object based on the QSessionManager information. Add a new variant that accepts the session manager object. BUG: 346768 --- src/gui/kconfiggui.cpp | 48 ++++++++++++++++++++++++++++++++++++++---------- src/gui/kconfiggui.h | 14 +++++++++++++- 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/gui/kconfiggui.cpp b/src/gui/kconfiggui.cpp index 0048c60..e1dcd09 100644 --- a/src/gui/kconfiggui.cpp +++ b/src/gui/kconfiggui.cpp @@ -22,19 +22,52 @@ #include "kconfiggui.h" #include +#include #include +#define SESSION_TEMPLATE(id, key) \ + QLatin1String("session/") + QGuiApplication::applicationName() + \ + QLatin1Char('_') + (id) + \ + QLatin1Char('_') + (key) + static KConfig *s_sessionConfig = Q_NULLPTR; -KConfig *KConfigGui::sessionConfig() +static void ensureSessionConfig(void) { - if (!s_sessionConfig) { // create an instance specific config object - s_sessionConfig = new KConfig(sessionConfigName(), KConfig::SimpleConfig); +#ifdef QT_NO_SESSIONMANAGER +#error QT_NO_SESSIONMANAGER was set, this will not compile. Reconfigure Qt with Session management support. +#endif + if (s_sessionConfig == Q_NULLPTR) { + // create an instance specific config object + s_sessionConfig = new KConfig(SESSION_TEMPLATE(qApp->sessionId(), + qApp->sessionKey()), + KConfig::SimpleConfig); } +} + +KConfig *KConfigGui::sessionConfig() +{ + ensureSessionConfig(); return s_sessionConfig; } +KConfig *KConfigGui::sessionConfig(const QSessionManager &sm) +{ + if (hasSessionConfig()) { + // delete old config object without storing it to disk + s_sessionConfig->markAsClean(); + delete s_sessionConfig; + s_sessionConfig = Q_NULLPTR; + } + + // create a new instance specific config object + s_sessionConfig = new KConfig(SESSION_TEMPLATE(sm.sessionId(), + sm.sessionKey()), + KConfig::SimpleConfig); + return(s_sessionConfig); +} + bool KConfigGui::hasSessionConfig() { return s_sessionConfig != Q_NULLPTR; @@ -42,11 +75,6 @@ bool KConfigGui::hasSessionConfig() QString KConfigGui::sessionConfigName() { -#ifdef QT_NO_SESSIONMANAGER -#error QT_NO_SESSIONMANAGER was set, this will not compile. Reconfigure Qt with Session management support. -#endif - const QString sessionKey = qApp->sessionKey(); - const QString sessionId = qApp->sessionId(); - return QString(QLatin1String("session/%1_%2_%3")).arg(QGuiApplication::applicationName()).arg(sessionId).arg(sessionKey); + ensureSessionConfig(); + return s_sessionConfig->name(); } - diff --git a/src/gui/kconfiggui.h b/src/gui/kconfiggui.h index 173400f..10083b2 100644 --- a/src/gui/kconfiggui.h +++ b/src/gui/kconfiggui.h @@ -27,11 +27,12 @@ #include class KConfig; +class QSessionManager; namespace KConfigGui { /** - * Returns the application session config object. + * Returns the current application session config object. * * @return A pointer to the application's instance specific * KConfig object. @@ -40,6 +41,17 @@ namespace KConfigGui KCONFIGGUI_EXPORT KConfig *sessionConfig(); /** + * Updates application session config object. + * + * @param sm session manager object + * + * @return A pointer to the application's instance specific + * KConfig object. + * @see KConfig + */ +KCONFIGGUI_EXPORT KConfig *sessionConfig(const QSessionManager &sm); + +/** * Indicates if a session config has been created for that application * (ie. if sessionConfig() got called at least once) * -- 2.4.0