summaryrefslogtreecommitdiff
path: root/source/l/qt5/patches/qt5.qtbug-61140.patch
blob: 17468a957024cae4c1e4278aaaabaa5bacbdabb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
https://github.com/qt/qtbase/commit/744fd39e.patch

From 744fd39e66b0b44e65a2505d674fa1cda8b205a4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= <tor.arne.vestbo@qt.io>
Date: Fri, 2 Jun 2017 11:09:55 +0200
Subject: [PATCH] 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>
---
 src/plugins/platforms/xcb/qxcbintegration.cpp | 18 +-----------------
 src/plugins/platforms/xcb/qxcbwindow.cpp      | 16 ++++++++++------
 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 @@ public Q_SLOTS:
     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*)