From 74751fdfc3b43dbb2a8aa3dc94b462e994324885 Mon Sep 17 00:00:00 2001 From: Rex Dieter Date: Mon, 11 May 2015 15:43:00 -0500 Subject: [PATCH] pull in reviewed/upstreamed session management fixes (kde#346768) --- 0001-Add-KConfigGui-setSessionConfig.patch | 127 +++++++++++++++++ ...variant-for-KConfigGui_sessionConfig.patch | 128 ------------------ kf5-kconfig.spec | 10 +- 3 files changed, 133 insertions(+), 132 deletions(-) create mode 100644 0001-Add-KConfigGui-setSessionConfig.patch delete mode 100644 Add-2nd-variant-for-KConfigGui_sessionConfig.patch diff --git a/0001-Add-KConfigGui-setSessionConfig.patch b/0001-Add-KConfigGui-setSessionConfig.patch new file mode 100644 index 0000000..7389d06 --- /dev/null +++ b/0001-Add-KConfigGui-setSessionConfig.patch @@ -0,0 +1,127 @@ +From ceb84f777b217c4a25c0e2356ddab372fae6f562 Mon Sep 17 00:00:00 2001 +From: Stefan Becker +Date: Sat, 9 May 2015 17:16:27 +0300 +Subject: [PATCH] Add KConfigGui::setSessionConfig() + +When the application receives a saveState signal it needs to replace the +current KConfig object with a new one based on the QSessionManager +information. Add a new interface that accepts the new session id and key. + +BUG: 346768 +REVIEW: 123705 +--- + src/gui/kconfiggui.cpp | 41 ++++++++++++++++++++++++++++++++--------- + src/gui/kconfiggui.h | 17 +++++++++++++++-- + 2 files changed, 47 insertions(+), 11 deletions(-) + +diff --git a/src/gui/kconfiggui.cpp b/src/gui/kconfiggui.cpp +index 0048c60..67b6009 100644 +--- a/src/gui/kconfiggui.cpp ++++ b/src/gui/kconfiggui.cpp +@@ -25,28 +25,51 @@ + + #include + ++static QString configName(const QString &id, const QString &key) ++{ ++ return(QLatin1String("session/") + QGuiApplication::applicationName() + ++ QLatin1Char('_') + id + ++ QLatin1Char('_') + key); ++} ++ + static KConfig *s_sessionConfig = Q_NULLPTR; + + KConfig *KConfigGui::sessionConfig() + { +- 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 (!hasSessionConfig()) { ++ // create the default instance specific config object ++ // from applications' -session command line parameter ++ s_sessionConfig = new KConfig(configName(qApp->sessionId(), ++ qApp->sessionKey()), ++ KConfig::SimpleConfig); + } ++ + return s_sessionConfig; + } + ++void KConfigGui::setSessionConfig(const QString &id, const QString &key) ++{ ++ if (hasSessionConfig()) { ++ delete s_sessionConfig; ++ s_sessionConfig = Q_NULLPTR; ++ } ++ ++ // create a new instance specific config object from supplied id & key ++ s_sessionConfig = new KConfig(configName(id, key), ++ KConfig::SimpleConfig); ++} ++ + bool KConfigGui::hasSessionConfig() + { + return s_sessionConfig != Q_NULLPTR; + } + ++#ifndef KDE_NO_DEPRECATED + 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); ++ return sessionConfig()->name(); + } +- ++#endif +diff --git a/src/gui/kconfiggui.h b/src/gui/kconfiggui.h +index 173400f..fe1f820 100644 +--- a/src/gui/kconfiggui.h ++++ b/src/gui/kconfiggui.h +@@ -31,7 +31,7 @@ class KConfig; + 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 +40,16 @@ namespace KConfigGui + KCONFIGGUI_EXPORT KConfig *sessionConfig(); + + /** ++ * Replaces the current application session config object. ++ * ++ * @param id new session id ++ * @param key new session key ++ * ++ * @since 5.11 ++ */ ++KCONFIGGUI_EXPORT void setSessionConfig(const QString &id, const QString &key); ++ ++/** + * Indicates if a session config has been created for that application + * (ie. if sessionConfig() got called at least once) + * +@@ -51,8 +61,11 @@ KCONFIGGUI_EXPORT bool hasSessionConfig(); + * Returns the name of the application session + * + * @return the application session name ++ * @deprecated since 5.11, use sessionConfig()->name() + */ +-KCONFIGGUI_EXPORT QString sessionConfigName(); ++#ifndef KDE_NO_DEPRECATED ++KCONFIGGUI_DEPRECATED QString sessionConfigName(); ++#endif + } + + #endif // KCONFIGGUI_H +-- +2.4.0 + diff --git a/Add-2nd-variant-for-KConfigGui_sessionConfig.patch b/Add-2nd-variant-for-KConfigGui_sessionConfig.patch deleted file mode 100644 index bce4ea8..0000000 --- a/Add-2nd-variant-for-KConfigGui_sessionConfig.patch +++ /dev/null @@ -1,128 +0,0 @@ -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 - diff --git a/kf5-kconfig.spec b/kf5-kconfig.spec index b0364d6..c8dbe75 100644 --- a/kf5-kconfig.spec +++ b/kf5-kconfig.spec @@ -2,7 +2,7 @@ Name: kf5-%{framework} Version: 5.10.0 -Release: 1%{?dist} +Release: 2%{?dist} Summary: KDE Frameworks 5 Tier 1 addon with advanced configuration system License: GPLv2+ and LGPLv2+ and MIT @@ -17,9 +17,8 @@ URL: http://www.kde.org %endif Source0: http://download.kde.org/%{stable}/frameworks/%{versiondir}/%{framework}-%{version}.tar.xz -## upstreamable patches -# Candidate session management fixes -# https://bugs.kde.org/show_bug.cgi?id=346768 +## upstream patches +Patch1: 0001-Add-KConfigGui-setSessionConfig.patch BuildRequires: kf5-rpm-macros BuildRequires: extra-cmake-modules @@ -113,6 +112,9 @@ make install/fast DESTDIR=%{buildroot} -C %{_target_platform} %changelog +* Mon May 11 2015 Rex Dieter 5.10.0-2 +- pull in reviewed/upstreamed session management fixes (kde#346768) + * Mon May 11 2015 Daniel Vrátil - 5.10.0-1 - KDE Frameworks 5.10.0