Add attribute to disable QSessionManager

Loading a session manager can be problemtatic for system services that
are always auto-activated or small DBus activated helpers which
shouldn't really be restored nor gain anything from a session.

The current solutions is to connect to commitDataRequest and
saveStateRequest and then reset a restart hint.

It's very unintuitive and somewhat wasteful given the X session manager
is full of slow blocking calls.

Rather than changing the behavior of QGuiApplication and handling null
pointers, this patch loads the base QPlatformSessionManager that is used
by QPAs that don't have a session manager.

Change-Id: I976521d551549e2d56076e968c6be5421e4a9c20
Reviewed-by: Albert Astals Cid <aacid@kde.org>
Reviewed-by: Aleix Pol Gonzalez <aleixpol@kde.org>
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
This commit is contained in:
David Edmundson 2019-02-28 23:47:14 +00:00
parent 3b756bdcf5
commit 404bee752c
3 changed files with 13 additions and 1 deletions

View File

@ -546,6 +546,7 @@ public:
AA_DontShowShortcutsInContextMenus = 28,
AA_CompressTabletEvents = 29,
AA_DisableWindowContextHelpButton = 30, // ### Qt 6: remove me
AA_DisableSessionManager = 31,
// Add new attributes before this line
AA_AttributeCount

View File

@ -286,6 +286,13 @@
This value was added in Qt 5.10. In Qt 6, WindowContextHelpButtonHint
will not be set by default.
\value AA_DisableSessionManager Disables the QSessionManager.
By default Qt will connect to a running session manager for a GUI
application on supported platforms, use of a session manager may be
redundant for system services.
This attribute must be set before QGuiApplication is constructed.
This value was added in 5.13
The following values are deprecated or obsolete:
\value AA_ImmediateWidgetCreation This attribute is no longer fully

View File

@ -123,7 +123,11 @@ QSessionManagerPrivate::QSessionManagerPrivate(const QString &id,
const QString &key)
: QObjectPrivate()
{
platformSessionManager = QGuiApplicationPrivate::platformIntegration()->createPlatformSessionManager(id, key);
if (qApp->testAttribute(Qt::AA_DisableSessionManager)) {
platformSessionManager = new QPlatformSessionManager(id, key);
} else {
platformSessionManager = QGuiApplicationPrivate::platformIntegration()->createPlatformSessionManager(id, key);
}
Q_ASSERT_X(platformSessionManager, "Platform session management",
"No platform session management, should use the default implementation");
}