summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2021-09-07 11:41:26 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2021-09-07 21:09:49 +0200
commit121fddcf5ae2ab238ef802e44b45ce62c56015f5 (patch)
tree43b9c9508bbceba0067505f300bb81bdf1979bc6 /src
parent80256b3683ca95907e71a7c127c74b865b1f0fe7 (diff)
Split up close handling in QWidget into a pre and post step
If we are the one initiating the close (from Qt Widget land), we want to mark the widget as closing as early as possible. Clarified the role of close_helper by renaming it to handleClose. Change-Id: Iae250a0ae1583d743c59e99fcb99fdf18d2a1882 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/widgets/dialogs/qdialog.cpp2
-rw-r--r--src/widgets/kernel/qwidget.cpp31
-rw-r--r--src/widgets/kernel/qwidget_p.h16
-rw-r--r--src/widgets/kernel/qwidgetwindow.cpp4
4 files changed, 31 insertions, 22 deletions
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp
index c416ba9a5c..9e18e2443a 100644
--- a/src/widgets/dialogs/qdialog.cpp
+++ b/src/widgets/dialogs/qdialog.cpp
@@ -155,7 +155,7 @@ void QDialogPrivate::hide(int resultCode)
q->setResult(resultCode);
q->hide();
- close_helper(QWidgetPrivate::CloseNoEvent);
+ handleClose(QWidgetPrivate::CloseNoEvent);
resetModalitySetByOpen();
}
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 90f89b99fe..069e77c1cb 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -1005,7 +1005,7 @@ void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f)
data.window_modality = Qt::NonModal;
data.sizehint_forced = 0;
- data.is_closing = 0;
+ data.is_closing = false;
data.in_show = 0;
data.in_set_window_state = 0;
data.in_destructor = false;
@@ -1466,7 +1466,7 @@ QWidget::~QWidget()
if (isWindow() && isVisible() && internalWinId()) {
QT_TRY {
- d->close_helper(QWidgetPrivate::CloseNoEvent);
+ d->handleClose(QWidgetPrivate::CloseNoEvent);
} QT_CATCH(...) {
// if we're out of memory, at least hide the window.
QT_TRY {
@@ -8385,13 +8385,12 @@ void QWidgetPrivate::hideChildren(bool spontaneous)
The function is also called by the QWidget destructor, with \a mode set to CloseNoEvent.
*/
-bool QWidgetPrivate::close_helper(CloseMode mode)
+bool QWidgetPrivate::handleClose(CloseMode mode)
{
- if (data.is_closing)
- return true;
-
Q_Q(QWidget);
- data.is_closing = 1;
+
+ // We might not have initiated the close, so update the state now that we know
+ data.is_closing = true;
QPointer<QWidget> that = q;
QPointer<QWidget> parentWidget = (q->parentWidget() && !QObjectPrivate::get(q->parentWidget())->wasDeleted) ? q->parentWidget() : nullptr;
@@ -8404,7 +8403,7 @@ bool QWidgetPrivate::close_helper(CloseMode mode)
else
QCoreApplication::sendEvent(q, &e);
if (!that.isNull() && !e.isAccepted()) {
- data.is_closing = 0;
+ data.is_closing = false;
return false;
}
}
@@ -8438,7 +8437,7 @@ bool QWidgetPrivate::close_helper(CloseMode mode)
if (!that.isNull()) {
- data.is_closing = 0;
+ data.is_closing = false;
if (q->testAttribute(Qt::WA_DeleteOnClose)) {
q->setAttribute(Qt::WA_DeleteOnClose, false);
q->deleteLater();
@@ -8472,13 +8471,23 @@ bool QWidgetPrivate::close_helper(CloseMode mode)
bool QWidget::close()
{
+ return d_func()->close();
+}
+
+bool QWidgetPrivate::close()
+{
+ if (data.is_closing)
+ return true;
+
+ data.is_closing = true;
+
// Close native widgets via QWindow::close() in order to run QWindow
- // close code. The QWidget-specific close code in close_helper() will
+ // close code. The QWidget-specific close code in handleClose() will
// in this case be called from the Close event handler in QWidgetWindow.
if (QWindow *widgetWindow = windowHandle())
return widgetWindow->close();
- return d_func()->close_helper(QWidgetPrivate::CloseWithEvent);
+ return handleClose(QWidgetPrivate::CloseWithEvent);
}
/*!
diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h
index a8a3ad1447..db458be7f1 100644
--- a/src/widgets/kernel/qwidget_p.h
+++ b/src/widgets/kernel/qwidget_p.h
@@ -236,13 +236,6 @@ public:
Q_DECLARE_FLAGS(DrawWidgetFlags, DrawWidgetFlag)
Q_FLAG(DrawWidgetFlags)
- enum CloseMode {
- CloseNoEvent,
- CloseWithEvent,
- CloseWithSpontaneousEvent
- };
- Q_ENUM(CloseMode)
-
enum Direction {
DirectionNorth = 0x01,
DirectionEast = 0x10,
@@ -374,7 +367,14 @@ public:
const QRegion &getOpaqueChildren() const;
void setDirtyOpaqueRegion();
- bool close_helper(CloseMode mode);
+ bool close();
+ enum CloseMode {
+ CloseNoEvent,
+ CloseWithEvent,
+ CloseWithSpontaneousEvent
+ };
+ Q_ENUM(CloseMode)
+ bool handleClose(CloseMode mode);
void setWindowIcon_helper();
void setWindowIcon_sys();
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index 029d152f5d..5ca26a39cb 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -841,9 +841,9 @@ void QWidgetWindow::handleResizeEvent(QResizeEvent *event)
void QWidgetWindow::handleCloseEvent(QCloseEvent *event)
{
Q_D(QWidgetWindow);
- bool is_closing = m_widget->d_func()->close_helper(d->inClose ? QWidgetPrivate::CloseWithEvent
+ bool accepted = m_widget->d_func()->handleClose(d->inClose ? QWidgetPrivate::CloseWithEvent
: QWidgetPrivate::CloseWithSpontaneousEvent);
- event->setAccepted(is_closing);
+ event->setAccepted(accepted);
}
#if QT_CONFIG(wheelevent)