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
parent
ed2e157803
commit
d10bfff89a
|
|
@ -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.
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue