xcb: Don't destroy foreign windows

We can't rely on virtual dispatch in the destructor.

Task-number: QTBUG-61140
Change-Id: Ib1026caf126095778c24254775cb5a0bfecf3a38
Reviewed-by: Fabian Vogt
Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
This commit is contained in:
Tor Arne Vestbø 2017-06-02 11:09:55 +02:00
parent 94a2aec05b
commit 744fd39e66
3 changed files with 23 additions and 23 deletions

View File

@ -214,25 +214,9 @@ QPlatformWindow *QXcbIntegration::createPlatformWindow(QWindow *window) const
return xcbWindow;
}
class QXcbForeignWindow : public QXcbWindow
{
public:
QXcbForeignWindow(QWindow *window, WId nativeHandle)
: QXcbWindow(window) { m_window = nativeHandle; }
~QXcbForeignWindow() {}
bool isForeignWindow() const override { return true; }
protected:
// No-ops
void create() override {}
void destroy() override {}
};
QPlatformWindow *QXcbIntegration::createForeignWindow(QWindow *window, WId nativeHandle) const
{
QXcbWindow *xcbWindow = new QXcbForeignWindow(window, nativeHandle);
xcbWindow->create();
return xcbWindow;
return new QXcbForeignWindow(window, nativeHandle);
}
#ifndef QT_NO_OPENGL

View File

@ -597,13 +597,17 @@ QXcbWindow::~QXcbWindow()
}
destroy();
}
if (isForeignWindow()) {
if (connection()->mouseGrabber() == this)
connection()->setMouseGrabber(Q_NULLPTR);
if (connection()->mousePressWindow() == this)
connection()->setMousePressWindow(Q_NULLPTR);
}
QXcbForeignWindow::~QXcbForeignWindow()
{
// Clear window so that destroy() does not affect it
m_window = 0;
if (connection()->mouseGrabber() == this)
connection()->setMouseGrabber(nullptr);
if (connection()->mousePressWindow() == this)
connection()->setMousePressWindow(nullptr);
}
void QXcbWindow::destroy()

View File

@ -278,6 +278,18 @@ protected:
xcb_cursor_t m_currentBitmapCursor = XCB_CURSOR_NONE;
};
class QXcbForeignWindow : public QXcbWindow
{
public:
QXcbForeignWindow(QWindow *window, WId nativeHandle)
: QXcbWindow(window) { m_window = nativeHandle; }
~QXcbForeignWindow();
bool isForeignWindow() const override { return true; }
protected:
void create() override {} // No-op
};
QT_END_NAMESPACE
Q_DECLARE_METATYPE(QXcbWindow*)