Unset _NET_WM_USER_TIME_WINDOW before destroying the window

Otherwise metacity was crashing when a QWindow was destroyed immediately
after being activated, because metacity was trying to select events
(XSelectInput) for the already destroyed m_netWmUserTimeWindow.

Task-number: QTBUG-24492
Change-Id: Iedbe7bdd6b26110ca8bec6f33525209ae551ffd5
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
This commit is contained in:
Jan Arne Petersen 2012-02-24 18:05:06 +01:00 committed by Qt by Nokia
parent e51e7b851f
commit 022ff04a6b
2 changed files with 21 additions and 0 deletions

View File

@ -369,6 +369,14 @@ void QXcbWindow::destroy()
if (m_syncCounter && m_screen->syncRequestSupported())
Q_XCB_CALL(xcb_sync_destroy_counter(xcb_connection(), m_syncCounter));
if (m_window) {
if (m_netWmUserTimeWindow) {
xcb_delete_property(xcb_connection(), m_window, atom(QXcbAtom::_NET_WM_USER_TIME_WINDOW));
// Some window managers, like metacity, do XSelectInput on the _NET_WM_USER_TIME_WINDOW window,
// without trapping BadWindow (which crashes when the user time window is destroyed).
connection()->sync();
xcb_destroy_window(xcb_connection(), m_netWmUserTimeWindow);
m_netWmUserTimeWindow = XCB_NONE;
}
connection()->removeWindow(m_window);
Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window));
}

View File

@ -64,6 +64,8 @@ private slots:
void touchCancelWithTouchToMouse();
void orientation();
void close();
void activateAndClose();
void initTestCase()
{
touchDevice = new QTouchDevice;
@ -632,5 +634,16 @@ void tst_QWindow::close()
QVERIFY(b.close());
}
void tst_QWindow::activateAndClose()
{
for (int i = 0; i < 10; ++i) {
QWindow window;
window.show();
QTest::qWaitForWindowShown(&window);
window.requestActivateWindow();
QTRY_COMPARE(qGuiApp->focusWindow(), &window);
}
}
#include <tst_qwindow.moc>
QTEST_MAIN(tst_QWindow);