c50dd144b0
- Added QMimeDatabase-follow-symlinks-when-checking-for-FIFO.patch to fix dolphin freeze when opening a folder containing symlinks to special files (boo#957006, qtbug#48529) - Update Add-option-to-disable-session-management-by-closing-windows.patch to version actually commited upstream OBS-URL: https://build.opensuse.org/request/show/360928 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqt5-qtbase?expand=0&rev=51
208 lines
8.6 KiB
Diff
208 lines
8.6 KiB
Diff
From e7bf0edfd49de9a4d8285fbe8d878f8fda910e6d Mon Sep 17 00:00:00 2001
|
|
From: Andreas Hartmetz <ahartmetz@gmail.com>
|
|
Date: Tue, 19 Jan 2016 14:30:18 +0100
|
|
Subject: Add option to disable "session management by closing windows".
|
|
|
|
That feature is a poor man's session management for applications
|
|
that do not implement any specific session management features.
|
|
It badly interferes with proper session management support, so
|
|
applications must be able to disable it.
|
|
|
|
This enables fixing applications with
|
|
QGuiApplication::quitOnLastWindowClosed() true - the default -
|
|
dying too early, before they are enumerated for the list of
|
|
applications to restart on session restore, thus preventing them
|
|
from being restored. See
|
|
https://bugs.kde.org/show_bug.cgi?id=354724
|
|
|
|
[ChangeLog][QtGui] Qt asking to close windows on session exit as
|
|
a fallback session management mechanism has been made optional.
|
|
Disabling it fixes session management for applications that
|
|
implement full session management. See
|
|
QGuiApplication::isFallbackSessionManagementEnabled().
|
|
|
|
Task-number: QTBUG-49667
|
|
Change-Id: Ib22e58c9c64351dea8b7e2a74db91d26dd7ab7aa
|
|
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
|
|
Reviewed-by: David Faure <david.faure@kdab.com>
|
|
---
|
|
.../widgets/mainwindows/application/mainwindow.cpp | 16 ++++++
|
|
.../widgets/mainwindows/application/mainwindow.h | 2 +
|
|
.../code/src_gui_kernel_qguiapplication.cpp | 1 +
|
|
src/gui/kernel/qguiapplication.cpp | 60 +++++++++++++++++++++-
|
|
src/gui/kernel/qguiapplication.h | 3 ++
|
|
src/gui/kernel/qguiapplication_p.h | 1 +
|
|
src/gui/kernel/qsessionmanager.cpp | 19 ++++---
|
|
7 files changed, 90 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/src/gui/doc/snippets/code/src_gui_kernel_qguiapplication.cpp b/src/gui/doc/snippets/code/src_gui_kernel_qguiapplication.cpp
|
|
index 4ddf8c8..63fdb3b 100644
|
|
--- a/src/gui/doc/snippets/code/src_gui_kernel_qguiapplication.cpp
|
|
+++ b/src/gui/doc/snippets/code/src_gui_kernel_qguiapplication.cpp
|
|
@@ -53,6 +53,7 @@ int main(int argc, char *argv[])
|
|
MyMainWidget::MyMainWidget(QWidget *parent)
|
|
:QWidget(parent)
|
|
{
|
|
+ QGuiApplication::setFallbackSessionManagementEnabled(false);
|
|
connect(qApp, SIGNAL(commitDataRequest(QSessionManager)), SLOT(commitData(QSessionManager)));
|
|
}
|
|
|
|
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
|
|
index 65d679c..8f1c62f 100644
|
|
--- a/src/gui/kernel/qguiapplication.cpp
|
|
+++ b/src/gui/kernel/qguiapplication.cpp
|
|
@@ -138,6 +138,8 @@ QPlatformTheme *QGuiApplicationPrivate::platform_theme = 0;
|
|
|
|
QList<QObject *> QGuiApplicationPrivate::generic_plugin_list;
|
|
|
|
+bool QGuiApplicationPrivate::is_fallback_session_management_enabled = true;
|
|
+
|
|
enum ApplicationResourceFlags
|
|
{
|
|
ApplicationPaletteExplicitlySet = 0x1,
|
|
@@ -3082,6 +3084,55 @@ void QGuiApplicationPrivate::setApplicationState(Qt::ApplicationState state, boo
|
|
emit qApp->applicationStateChanged(applicationState);
|
|
}
|
|
|
|
+// ### Qt6: consider removing the feature or making it less intrusive
|
|
+/*!
|
|
+ \since 5.6
|
|
+
|
|
+ Returns whether QGuiApplication will use fallback session management.
|
|
+
|
|
+ The default is \c true.
|
|
+
|
|
+ If this is \c true and the session manager allows user interaction,
|
|
+ QGuiApplication will try to close toplevel windows after
|
|
+ commitDataRequest() has been emitted. If a window cannot be closed, session
|
|
+ shutdown will be canceled and the application will keep running.
|
|
+
|
|
+ Fallback session management only benefits applications that have an
|
|
+ "are you sure you want to close this window?" feature or other logic that
|
|
+ prevents closing a toplevel window depending on certain conditions, and
|
|
+ that do nothing to explicitly implement session management. In applications
|
|
+ that \e do implement session management using the proper session management
|
|
+ API, fallback session management interferes and may break session
|
|
+ management logic.
|
|
+
|
|
+ \warning If all windows \e are closed due to fallback session management
|
|
+ and quitOnLastWindowClosed() is \c true, the application will quit before
|
|
+ it is explicitly instructed to quit through the platform's session
|
|
+ management protocol. That violation of protocol may prevent the platform
|
|
+ session manager from saving application state.
|
|
+
|
|
+ \sa setFallbackSessionManagementEnabled(),
|
|
+ QSessionManager::allowsInteraction(), saveStateRequest(),
|
|
+ commitDataRequest(), {Session Management}
|
|
+*/
|
|
+bool QGuiApplication::isFallbackSessionManagementEnabled()
|
|
+{
|
|
+ return QGuiApplicationPrivate::is_fallback_session_management_enabled;
|
|
+}
|
|
+
|
|
+/*!
|
|
+ \since 5.6
|
|
+
|
|
+ Sets whether QGuiApplication will use fallback session management to
|
|
+ \a enabled.
|
|
+
|
|
+ \sa isFallbackSessionManagementEnabled()
|
|
+*/
|
|
+void QGuiApplication::setFallbackSessionManagementEnabled(bool enabled)
|
|
+{
|
|
+ QGuiApplicationPrivate::is_fallback_session_management_enabled = enabled;
|
|
+}
|
|
+
|
|
/*!
|
|
\since 4.2
|
|
\fn void QGuiApplication::commitDataRequest(QSessionManager &manager)
|
|
@@ -3106,7 +3157,8 @@ void QGuiApplicationPrivate::setApplicationState(Qt::ApplicationState state, boo
|
|
|
|
\note You should use Qt::DirectConnection when connecting to this signal.
|
|
|
|
- \sa isSessionRestored(), sessionId(), saveStateRequest(), {Session Management}
|
|
+ \sa setFallbackSessionManagementEnabled(), isSessionRestored(),
|
|
+ sessionId(), saveStateRequest(), {Session Management}
|
|
*/
|
|
|
|
/*!
|
|
@@ -3236,9 +3288,13 @@ void QGuiApplicationPrivate::commitData()
|
|
{
|
|
Q_Q(QGuiApplication);
|
|
is_saving_session = true;
|
|
+
|
|
emit q->commitDataRequest(*session_manager);
|
|
- if (session_manager->allowsInteraction() && !tryCloseAllWindows())
|
|
+ if (is_fallback_session_management_enabled && session_manager->allowsInteraction()
|
|
+ && !tryCloseAllWindows()) {
|
|
session_manager->cancel();
|
|
+ }
|
|
+
|
|
is_saving_session = false;
|
|
}
|
|
|
|
diff --git a/src/gui/kernel/qguiapplication.h b/src/gui/kernel/qguiapplication.h
|
|
index d995387..3f233d4 100644
|
|
--- a/src/gui/kernel/qguiapplication.h
|
|
+++ b/src/gui/kernel/qguiapplication.h
|
|
@@ -152,6 +152,9 @@ public:
|
|
QString sessionId() const;
|
|
QString sessionKey() const;
|
|
bool isSavingSession() const;
|
|
+
|
|
+ static bool isFallbackSessionManagementEnabled();
|
|
+ static void setFallbackSessionManagementEnabled(bool);
|
|
#endif
|
|
|
|
static void sync();
|
|
diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h
|
|
index 7c7da97..4f0f6fd 100644
|
|
--- a/src/gui/kernel/qguiapplication_p.h
|
|
+++ b/src/gui/kernel/qguiapplication_p.h
|
|
@@ -234,6 +234,7 @@ public:
|
|
#endif
|
|
|
|
#ifndef QT_NO_SESSIONMANAGER
|
|
+ static bool is_fallback_session_management_enabled;
|
|
QSessionManager *session_manager;
|
|
bool is_session_restored;
|
|
bool is_saving_session;
|
|
diff --git a/src/gui/kernel/qsessionmanager.cpp b/src/gui/kernel/qsessionmanager.cpp
|
|
index f4b56fd..c6d23f1 100644
|
|
--- a/src/gui/kernel/qsessionmanager.cpp
|
|
+++ b/src/gui/kernel/qsessionmanager.cpp
|
|
@@ -64,22 +64,21 @@ QT_BEGIN_NAMESPACE
|
|
settings.
|
|
|
|
QSessionManager provides an interface between the application and the
|
|
- session manager so that the program can work well with the session manager.
|
|
- In Qt, session management requests for action are handled by the two
|
|
- signals QGuiApplication::commitDataRequest() and
|
|
- QGuiApplication::saveStateRequest(). Both provide a reference to a session
|
|
- manager object as argument, to allow the application to communicate with
|
|
- the session manager. The session manager can only be accessed through these
|
|
- functions.
|
|
+ platform's session manager. In Qt, session management requests for action
|
|
+ are handled by the two signals QGuiApplication::commitDataRequest() and
|
|
+ QGuiApplication::saveStateRequest(). Both provide a reference to a
|
|
+ QSessionManager object as argument. The session manager can only be
|
|
+ accessed in slots invoked by these signals.
|
|
+
|
|
+ \warning If you use QSessionManager, you should disable fallback session
|
|
+ management: QGuiApplication::setFallbackSessionManagementEnabled().
|
|
|
|
No user interaction is possible \e unless the application gets explicit
|
|
permission from the session manager. You ask for permission by calling
|
|
allowsInteraction() or, if it is really urgent, allowsErrorInteraction().
|
|
Qt does not enforce this, but the session manager may.
|
|
|
|
- You can try to abort the shutdown process by calling cancel(). The default
|
|
- commitData() function does this if some top-level window rejected its
|
|
- closeEvent().
|
|
+ You can try to abort the shutdown process by calling cancel().
|
|
|
|
For sophisticated session managers provided on Unix/X11, QSessionManager
|
|
offers further possibilities to fine-tune an application's session
|
|
--
|
|
cgit v0.11.0
|