From 132ed5eb51c63bd34a5d96fc29e8e3868e5ce5a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 13 Oct 2021 15:41:28 +0200 Subject: Centralize maybeLastWindowClosed checking in QWindow Instead of plumbing QWidgetWindow close events via handleCloseEvent, we just implement closeEvent directly. This allows QWindow do save the state of the window/widget before the close event, so that we know whether we should trigger lastWindowClosed handling, even if the window was deleted as a result of the close event. This also relieves QGuiApplication and QApplication from dealing with the close logic in their notify functions, so that these functions can focus on the propagation of events -- not how the event is handled. Change-Id: I8b586b53a53b1df1d8630c1acb635c60f191bb4b Reviewed-by: Qt CI Bot Reviewed-by: Volker Hilsheimer --- src/gui/kernel/qwindow.cpp | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'src/gui/kernel/qwindow.cpp') diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 561682f65d..631b1fe723 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -2292,6 +2292,12 @@ bool QWindowPrivate::participatesInLastWindowClosed() const return true; } +bool QWindowPrivate::treatAsVisible() const +{ + Q_Q(const QWindow); + return q->isVisible(); +} + /*! The expose event (\a ev) is sent by the window system when a window moves between the un-exposed and exposed states. @@ -2466,11 +2472,25 @@ bool QWindow::event(QEvent *ev) break; #endif - case QEvent::Close: + case QEvent::Close: { + + Q_D(QWindow); + const bool wasVisible = d->treatAsVisible(); + const bool participatesInLastWindowClosed = d->participatesInLastWindowClosed(); + + // The window might be deleted in the close event handler + QPointer deletionGuard(this); closeEvent(static_cast(ev)); - if (ev->isAccepted()) - destroy(); + + if (ev->isAccepted()) { + if (deletionGuard) + destroy(); + if (wasVisible && participatesInLastWindowClosed) + QGuiApplicationPrivate::instance()->maybeLastWindowClosed(); + } + break; + } case QEvent::Expose: exposeEvent(static_cast(ev)); -- cgit v1.2.3