summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2019-10-15 14:18:40 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2020-09-14 12:41:00 +0200
commit0c02f133f3daee146b805149e69bba8cee6727b2 (patch)
treec013e3a10a6ae804f33c05e077dcf8b346a4eea7 /src/gui
parentcc570ce2fe22e6314d378d3f2d6e4ae1a08df3a2 (diff)
Plumb application quit through platform plugin
If we have a platform plugin we ask the platform to quit, and if not we fall back to the base implementation of QCoreApplication that sends Quit events directly. This allows the platform to involve the rest of the system in the process. The platform will then come back with a spontaneous quit via QWSI::handleApplicationTermination(), which will then send the corresponding Quit even from QGuiApplication like normal. Task-number: QTBUG-45262 Task-number: QTBUG-33235 Task-number: QTBUG-72013 Task-number: QTBUG-59782 Change-Id: I0000aaf7192e4b905933c5da0e53901c6c88f26a Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/kernel/qguiapplication.cpp8
-rw-r--r--src/gui/kernel/qguiapplication_p.h1
-rw-r--r--src/gui/kernel/qplatformintegration.cpp14
-rw-r--r--src/gui/kernel/qplatformintegration.h1
4 files changed, 24 insertions, 0 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index 37e8edb6f7..15955e2287 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -3641,6 +3641,14 @@ bool QGuiApplicationPrivate::shouldQuitInternal(const QWindowList &processedWind
return true;
}
+void QGuiApplicationPrivate::quit()
+{
+ if (auto *platformIntegration = QGuiApplicationPrivate::platformIntegration())
+ platformIntegration->quit();
+ else
+ QCoreApplicationPrivate::quit();
+}
+
void QGuiApplicationPrivate::processApplicationTermination(QWindowSystemInterfacePrivate::WindowSystemEvent *windowSystemEvent)
{
QEvent event(QEvent::Quit);
diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h
index 2bbb5ae9a6..7e3c2931f3 100644
--- a/src/gui/kernel/qguiapplication_p.h
+++ b/src/gui/kernel/qguiapplication_p.h
@@ -105,6 +105,7 @@ public:
void addQtOptions(QList<QCommandLineOption> *options) override;
#endif
virtual bool shouldQuit() override;
+ void quit() override;
bool shouldQuitInternal(const QWindowList &processedWindows);
diff --git a/src/gui/kernel/qplatformintegration.cpp b/src/gui/kernel/qplatformintegration.cpp
index 1127ab43d2..634a04b791 100644
--- a/src/gui/kernel/qplatformintegration.cpp
+++ b/src/gui/kernel/qplatformintegration.cpp
@@ -529,6 +529,20 @@ void QPlatformIntegration::beep() const
{
}
+/*!
+ \since 6.0
+
+ Asks the platform to terminate the application.
+
+ Overrides should ensure there's a callback into the QWSI
+ function handleApplicationTermination so that the quit can
+ be propagated to QtGui and the application.
+*/
+void QPlatformIntegration::quit() const
+{
+ QWindowSystemInterface::handleApplicationTermination<QWindowSystemInterface::SynchronousDelivery>();
+}
+
#ifndef QT_NO_OPENGL
/*!
Platform integration function for querying the OpenGL implementation type.
diff --git a/src/gui/kernel/qplatformintegration.h b/src/gui/kernel/qplatformintegration.h
index 638d373c3c..5083542e12 100644
--- a/src/gui/kernel/qplatformintegration.h
+++ b/src/gui/kernel/qplatformintegration.h
@@ -220,6 +220,7 @@ public:
virtual void setApplicationIcon(const QIcon &icon) const;
virtual void beep() const;
+ virtual void quit() const;
#if QT_CONFIG(vulkan) || defined(Q_CLANG_QDOC)
virtual QPlatformVulkanInstance *createPlatformVulkanInstance(QVulkanInstance *instance) const;