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:
parent
e51e7b851f
commit
022ff04a6b
@ -369,6 +369,14 @@ void QXcbWindow::destroy()
|
|||||||
if (m_syncCounter && m_screen->syncRequestSupported())
|
if (m_syncCounter && m_screen->syncRequestSupported())
|
||||||
Q_XCB_CALL(xcb_sync_destroy_counter(xcb_connection(), m_syncCounter));
|
Q_XCB_CALL(xcb_sync_destroy_counter(xcb_connection(), m_syncCounter));
|
||||||
if (m_window) {
|
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);
|
connection()->removeWindow(m_window);
|
||||||
Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window));
|
Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window));
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,8 @@ private slots:
|
|||||||
void touchCancelWithTouchToMouse();
|
void touchCancelWithTouchToMouse();
|
||||||
void orientation();
|
void orientation();
|
||||||
void close();
|
void close();
|
||||||
|
void activateAndClose();
|
||||||
|
|
||||||
void initTestCase()
|
void initTestCase()
|
||||||
{
|
{
|
||||||
touchDevice = new QTouchDevice;
|
touchDevice = new QTouchDevice;
|
||||||
@ -632,5 +634,16 @@ void tst_QWindow::close()
|
|||||||
QVERIFY(b.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>
|
#include <tst_qwindow.moc>
|
||||||
QTEST_MAIN(tst_QWindow);
|
QTEST_MAIN(tst_QWindow);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user