diff options
-rw-r--r-- | src/gui/kernel/qplatformwindow.cpp | 2 | ||||
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 46 | ||||
-rw-r--r-- | src/widgets/accessible/qaccessiblewidgetfactory.cpp | 9 | ||||
-rw-r--r-- | tests/auto/gui/kernel/qwindow/tst_qwindow.cpp | 13 | ||||
-rw-r--r-- | tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp | 3 |
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); } |