diff options
-rw-r--r-- | src/corelib/kernel/qcoreapplication.cpp | 13 | ||||
-rw-r--r-- | src/corelib/kernel/qcoreapplication_p.h | 2 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 8 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication_p.h | 1 | ||||
-rw-r--r-- | src/gui/kernel/qplatformintegration.cpp | 14 | ||||
-rw-r--r-- | src/gui/kernel/qplatformintegration.h | 1 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm | 4 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoahelpers.h | 1 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoahelpers.mm | 1 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoaintegration.h | 1 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoaintegration.mm | 6 |
11 files changed, 45 insertions, 7 deletions
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index dd52242c6f..86530f0cfc 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -1975,11 +1975,18 @@ void QCoreApplication::quit() if (!self) return; - if (QThread::currentThread() == self->d_func()->mainThread()) { + self->d_func()->quit(); +} + +void QCoreApplicationPrivate::quit() +{ + Q_Q(QCoreApplication); + + if (QThread::currentThread() == mainThread()) { QEvent quitEvent(QEvent::Quit); - QCoreApplication::sendEvent(self, &quitEvent); + QCoreApplication::sendEvent(q, &quitEvent); } else { - QCoreApplication::postEvent(self, new QEvent(QEvent::Quit)); + QCoreApplication::postEvent(q, new QEvent(QEvent::Quit)); } } diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h index 08a7e974ea..04a740caf1 100644 --- a/src/corelib/kernel/qcoreapplication_p.h +++ b/src/corelib/kernel/qcoreapplication_p.h @@ -135,6 +135,8 @@ public: virtual bool shouldQuit() { return true; } + + virtual void quit(); void maybeQuit(); static QBasicAtomicPointer<QThread> theMainThread; 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; diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm index 62f2cc30e0..e6e46cda81 100644 --- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm +++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm @@ -92,10 +92,6 @@ #include <qpa/qwindowsysteminterface.h> #include <qwindowdefs.h> -QT_BEGIN_NAMESPACE -Q_LOGGING_CATEGORY(lcQpaApplication, "qt.qpa.application"); -QT_END_NAMESPACE - QT_USE_NAMESPACE @implementation QCocoaApplicationDelegate { diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.h b/src/plugins/platforms/cocoa/qcocoahelpers.h index d78aaadd4e..883c409924 100644 --- a/src/plugins/platforms/cocoa/qcocoahelpers.h +++ b/src/plugins/platforms/cocoa/qcocoahelpers.h @@ -72,6 +72,7 @@ Q_DECLARE_LOGGING_CATEGORY(lcQpaWindow) Q_DECLARE_LOGGING_CATEGORY(lcQpaDrawing) Q_DECLARE_LOGGING_CATEGORY(lcQpaMouse) Q_DECLARE_LOGGING_CATEGORY(lcQpaScreen) +Q_DECLARE_LOGGING_CATEGORY(lcQpaApplication) class QPixmap; class QString; diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.mm b/src/plugins/platforms/cocoa/qcocoahelpers.mm index 3e37010497..389766fdc7 100644 --- a/src/plugins/platforms/cocoa/qcocoahelpers.mm +++ b/src/plugins/platforms/cocoa/qcocoahelpers.mm @@ -59,6 +59,7 @@ Q_LOGGING_CATEGORY(lcQpaWindow, "qt.qpa.window"); Q_LOGGING_CATEGORY(lcQpaDrawing, "qt.qpa.drawing"); Q_LOGGING_CATEGORY(lcQpaMouse, "qt.qpa.input.mouse", QtCriticalMsg); Q_LOGGING_CATEGORY(lcQpaScreen, "qt.qpa.screen", QtCriticalMsg); +Q_LOGGING_CATEGORY(lcQpaApplication, "qt.qpa.application"); // // Conversion Functions diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h index f8b9e9fc12..1e330344af 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.h +++ b/src/plugins/platforms/cocoa/qcocoaintegration.h @@ -132,6 +132,7 @@ public: void setApplicationIcon(const QIcon &icon) const override; void beep() const override; + void quit() const override; void closePopups(QWindow *forWindow = nullptr); diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm index 250d9fc6e5..872d9bb7f1 100644 --- a/src/plugins/platforms/cocoa/qcocoaintegration.mm +++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm @@ -488,6 +488,12 @@ void QCocoaIntegration::beep() const NSBeep(); } +void QCocoaIntegration::quit() const +{ + qCDebug(lcQpaApplication) << "Terminating application"; + [NSApp terminate:nil]; +} + void QCocoaIntegration::closePopups(QWindow *forWindow) { for (auto it = m_popupWindowStack.begin(); it != m_popupWindowStack.end();) { |