diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2017-06-02 11:09:55 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2017-06-07 12:06:27 +0000 |
commit | 744fd39e66b0b44e65a2505d674fa1cda8b205a4 (patch) | |
tree | 4659e1f23ca30c0e79fa970d994d302726b355d4 /src/plugins | |
parent | 94a2aec05bcd40194354107eb8264bf28cbd2b19 (diff) |
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>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbintegration.cpp | 18 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.cpp | 16 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.h | 12 |
3 files changed, 23 insertions, 23 deletions
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index b414bee204..8e3ee20329 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -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 diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 289d0720e7..d6c69d52ef 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -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() diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h index 56628094ee..f38343b6c2 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.h +++ b/src/plugins/platforms/xcb/qxcbwindow.h @@ -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*) |