summaryrefslogtreecommitdiff
path: root/src/gui/kernel/qwindow.cpp
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2021-09-03 15:06:59 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2021-09-17 14:56:19 +0200
commit28b14b966fe8535d7a81914b70759546b694e31b (patch)
tree707f4b0702242cf4a7e01e5003d9772e8bb1a703 /src/gui/kernel/qwindow.cpp
parent1b0cb842129616d67ddf279e7e900fcdf433e390 (diff)
downloadqtbase-28b14b966fe8535d7a81914b70759546b694e31b.tar.gz
Deduplicate maybeQuitOnLastWindowClosed handling
The functionality now lives in QGuiApplication, and is triggered by QGuiApplication and QApplication after dispatching the close event to the window. The slight difference between how a Qt GUI and Qt Widget app determines if a window should contribute to the close-on-quit behavior has been abstracted into a QWindowPrivate helper. The additional checks that were in place for skipping out of the whole maybeQuitOnLastWindowClosed machinery have been kept. Task-number: QTBUG-53286 Change-Id: I81bd474755f9adb3a2b082621e5ecaa1c4726808 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/gui/kernel/qwindow.cpp')
-rw-r--r--src/gui/kernel/qwindow.cpp51
1 files changed, 13 insertions, 38 deletions
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index e1733cbf46..cdb2534b2e 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -2268,6 +2268,18 @@ bool QWindow::close()
return d->platformWindow->close();
}
+bool QWindowPrivate::shouldTriggerQuitOnClose() const
+{
+ Q_Q(const QWindow);
+ return q->isTopLevel();
+}
+
+bool QWindowPrivate::shouldCancelQuitOnClose() const
+{
+ Q_Q(const QWindow);
+ return q->isVisible() && !q->transientParent() && q->type() != Qt::ToolTip;
+}
+
/*!
The expose event (\a ev) is sent by the window system when a window moves
between the un-exposed and exposed states.
@@ -2444,17 +2456,8 @@ bool QWindow::event(QEvent *ev)
case QEvent::Close:
closeEvent(static_cast<QCloseEvent*>(ev));
- if (ev->isAccepted()) {
- Q_D(QWindow);
- bool wasVisible = isVisible();
+ if (ev->isAccepted())
destroy();
- if (wasVisible) {
- // FIXME: This check for visibility is a workaround for both QWidgetWindow
- // and QWindow having logic to emit lastWindowClosed, and possibly quit the
- // application. We should find a better way to handle this.
- d->maybeQuitOnLastWindowClosed();
- }
- }
break;
case QEvent::Expose:
@@ -2806,34 +2809,6 @@ Q_GUI_EXPORT QWindowPrivate *qt_window_private(QWindow *window)
return window->d_func();
}
-void QWindowPrivate::maybeQuitOnLastWindowClosed()
-{
- if (!QCoreApplication::instance())
- return;
-
- Q_Q(QWindow);
- if (!q->isTopLevel())
- return;
-
- QWindowList list = QGuiApplication::topLevelWindows();
- bool lastWindowClosed = true;
- for (int i = 0; i < list.size(); ++i) {
- QWindow *w = list.at(i);
- if (!w->isVisible() || w->transientParent() || w->type() == Qt::ToolTip)
- continue;
- lastWindowClosed = false;
- break;
- }
- if (lastWindowClosed) {
- QGuiApplicationPrivate::emitLastWindowClosed();
-
- if (QGuiApplication::quitOnLastWindowClosed()) {
- QCoreApplicationPrivate *applicationPrivate = static_cast<QCoreApplicationPrivate*>(QObjectPrivate::get(QCoreApplication::instance()));
- applicationPrivate->maybeQuit();
- }
- }
-}
-
QWindow *QWindowPrivate::topLevelWindow(QWindow::AncestorMode mode) const
{
Q_Q(const QWindow);