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:
parent
94a2aec05b
commit
744fd39e66
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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*)
|
||||
|
Loading…
x
Reference in New Issue
Block a user