diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2021-09-03 15:06:59 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2021-09-17 14:56:19 +0200 |
commit | 28b14b966fe8535d7a81914b70759546b694e31b (patch) | |
tree | 707f4b0702242cf4a7e01e5003d9772e8bb1a703 /src/gui/kernel/qwindow.cpp | |
parent | 1b0cb842129616d67ddf279e7e900fcdf433e390 (diff) | |
download | qtbase-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.cpp | 51 |
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); |