summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/qplatformwindow.cpp2
-rw-r--r--src/gui/kernel/qwindow.cpp46
-rw-r--r--src/widgets/accessible/qaccessiblewidgetfactory.cpp9
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_qwindow.cpp13
-rw-r--r--tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp3
5 files changed, 12 insertions, 61 deletions
diff --git a/src/gui/kernel/qplatformwindow.cpp b/src/gui/kernel/qplatformwindow.cpp
index fd3ce40342..aea029b7f5 100644
--- a/src/gui/kernel/qplatformwindow.cpp
+++ b/src/gui/kernel/qplatformwindow.cpp
@@ -62,8 +62,6 @@ QPlatformWindow::QPlatformWindow(QWindow *window)
*/
QPlatformWindow::~QPlatformWindow()
{
- // We don't flush window system events here, as the event will be
- // delivered with a platform window that is half-way destroyed.
}
/*!
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index 11ae3aa5c7..21734f1619 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -1648,6 +1648,15 @@ void QWindow::destroy()
}
}
+ if (QGuiApplicationPrivate::focus_window == this)
+ QGuiApplicationPrivate::focus_window = parent();
+ if (QGuiApplicationPrivate::currentMouseWindow == this)
+ QGuiApplicationPrivate::currentMouseWindow = parent();
+ if (QGuiApplicationPrivate::currentMousePressWindow == this)
+ QGuiApplicationPrivate::currentMousePressWindow = parent();
+ if (QGuiApplicationPrivate::tabletPressTarget == this)
+ QGuiApplicationPrivate::tabletPressTarget = parent();
+
bool wasVisible = isVisible();
d->visibilityOnDestroy = wasVisible && d->platformWindow;
@@ -1656,44 +1665,11 @@ void QWindow::destroy()
QPlatformSurfaceEvent e(QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed);
QGuiApplication::sendEvent(this, &e);
- QPlatformWindow *platformWindow = d->platformWindow;
- d->platformWindow = 0;
-
- // We flush before deleting the platform window so that any pending activation
- // events for the window will be delivered.
- QWindowSystemInterface::flushWindowSystemEvents();
-
- delete platformWindow;
-
- // Then we flush again so that if the platform plugin sent any deactivation
- // events as a result of being destroyed, we can pick that up by looking at
- // QGuiApplicationPrivate::focus_window, which will be up to date.
- QWindowSystemInterface::flushWindowSystemEvents();
-
+ delete d->platformWindow;
d->resizeEventPending = true;
d->receivedExpose = false;
d->exposed = false;
-
- // Ensure Qt doesn't refer to a destroyed QWindow if the platform plugin
- // didn't reset the window activation or other states as part of setVisible
- // or its destruction. We make a best guess of transferring to the parent
- // window, as this is what most window managers will do. We go through the
- // QWindowSystemInterface so that the proper signals and events are sent
- // as a result of the reset.
- if (QGuiApplicationPrivate::focus_window == this)
- QWindowSystemInterface::handleWindowActivated(parent());
- if (QGuiApplicationPrivate::currentMouseWindow == this)
- QWindowSystemInterface::handleEnterLeaveEvent(parent(), this);
-
- // FIXME: Handle these two though QPA like the others. Unfortunately both
- // processMouseEvent and processTabletEvent in QGuiApplication have conditions
- // that make sending the event though QPA not feasable right now.
- if (QGuiApplicationPrivate::currentMousePressWindow == this)
- QGuiApplicationPrivate::currentMousePressWindow = parent();
- if (QGuiApplicationPrivate::tabletPressTarget == this)
- QGuiApplicationPrivate::tabletPressTarget = parent();
-
- QWindowSystemInterface::flushWindowSystemEvents();
+ d->platformWindow = 0;
if (wasVisible)
d->maybeQuitOnLastWindowClosed();
diff --git a/src/widgets/accessible/qaccessiblewidgetfactory.cpp b/src/widgets/accessible/qaccessiblewidgetfactory.cpp
index 00e21da34d..4fa7c89482 100644
--- a/src/widgets/accessible/qaccessiblewidgetfactory.cpp
+++ b/src/widgets/accessible/qaccessiblewidgetfactory.cpp
@@ -43,7 +43,6 @@
#include <qtreeview.h>
#include <qvariant.h>
#include <qaccessible.h>
-#include <private/qwidget_p.h>
#ifndef QT_NO_ACCESSIBILITY
@@ -54,15 +53,7 @@ QAccessibleInterface *qAccessibleFactory(const QString &classname, QObject *obje
QAccessibleInterface *iface = 0;
if (!object || !object->isWidgetType())
return iface;
-
- // QWidget emits destroyed() from its destructor instead of letting the QObject
- // destructor do it, which means the QWidget is unregistered from the accessibillity
- // cache. But QWidget destruction also emits enter and leave events, which may end
- // up here, so we have to ensure that we don't fill the cache with an entry of
- // a widget that is going away.
QWidget *widget = static_cast<QWidget*>(object);
- if (QWidgetPrivate::get(widget)->data.in_destructor)
- return iface;
if (false) {
#ifndef QT_NO_LINEEDIT
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
index 794d549b57..a89f0da4d2 100644
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
@@ -94,7 +94,6 @@ private slots:
void modalWindowPosition();
void windowsTransientChildren();
void requestUpdate();
- void destroyResetsFocusWindow();
void initTestCase();
void stateChange_data();
void stateChange();
@@ -1805,18 +1804,6 @@ void tst_QWindow::requestUpdate()
QTRY_COMPARE(window.received(QEvent::UpdateRequest), 2);
}
-void tst_QWindow::destroyResetsFocusWindow()
-{
- QWindow window;
- window.showNormal();
- window.requestActivate();
- QVERIFY(QTest::qWaitForWindowActive(&window));
- QCOMPARE(qGuiApp->focusWindow(), &window);
-
- window.destroy();
- QVERIFY(!qGuiApp->focusWindow());
-}
-
#include <tst_qwindow.moc>
QTEST_MAIN(tst_QWindow)
diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
index bf17625803..b46609c371 100644
--- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
+++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
@@ -3570,7 +3570,7 @@ void tst_QLineEdit::task174640_editingFinished()
QVERIFY(QTest::qWaitForWindowExposed(testMenu1));
QTest::qWait(20);
mw.activateWindow();
- qApp->processEvents();
+
delete testMenu1;
QCOMPARE(editingFinishedSpy.count(), 0);
QTRY_VERIFY(le1->hasFocus());
@@ -3582,7 +3582,6 @@ void tst_QLineEdit::task174640_editingFinished()
QVERIFY(QTest::qWaitForWindowExposed(testMenu2));
QTest::qWait(20);
mw.activateWindow();
- qApp->processEvents();
delete testMenu2;
QCOMPARE(editingFinishedSpy.count(), 1);
}