Revert "QWindow::destroy(): only reset QGuiApp::focus_window and friends as a last resort"

This reverts commit 4c71db7567.

It's too risky for 5.6, we should let it cook in dev for a while
and backport when ready.

Change-Id: I91e677e65d967f29c84a254cd3dffc8bb847b263
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@theqtcompany.com>
bb10
Tor Arne Vestbø 2016-02-01 01:23:54 +01:00
parent ed2e157803
commit d10bfff89a
5 changed files with 12 additions and 61 deletions

View File

@ -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.
}
/*!

View File

@ -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();

View File

@ -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

View File

@ -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)

View File

@ -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);
}