summaryrefslogtreecommitdiff
path: root/src/client/qwaylandwindow.cpp
diff options
context:
space:
mode:
authorJohan Klokkhammer Helsing <johan.helsing@qt.io>2019-09-16 08:16:21 +0200
committerJohan Klokkhammer Helsing <johan.helsing@qt.io>2019-09-16 08:17:12 +0200
commitb4233b2f606617542c594e411640ef2867152d29 (patch)
treefc1fc95fa2df4ab21478e120feba8b34c1585db5 /src/client/qwaylandwindow.cpp
parent92768cf8d48d6fb62e1a0d124ea9cdec447df4d1 (diff)
parent382e3292aa0eb6addac84ddefeedc98c7f3b41b2 (diff)
downloadqtwayland-b4233b2f606617542c594e411640ef2867152d29.tar.gz
Merge remote-tracking branch 'origin/5.13' into 5.14
Conflicts: src/client/qwaylanddatadevice.cpp src/client/qwaylandinputcontext.cpp src/client/qwaylandinputdevice.cpp src/client/qwaylandwindow.cpp src/compositor/compositor_api/compositor_api.pri src/compositor/compositor_api/qwaylandquickitem.cpp Change-Id: Ice0d8c7d869c9c46113d6ee6ba3adf895a71d58f
Diffstat (limited to 'src/client/qwaylandwindow.cpp')
-rw-r--r--src/client/qwaylandwindow.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 60317cda..ccf4f8da 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -201,10 +201,13 @@ void QWaylandWindow::initWindow()
void QWaylandWindow::initializeWlSurface()
{
Q_ASSERT(!mSurface);
- mSurface.reset(new QWaylandSurface(mDisplay));
- connect(mSurface.data(), &QWaylandSurface::screensChanged,
- this, &QWaylandWindow::handleScreensChanged);
- mSurface->m_window = this;
+ {
+ QWriteLocker lock(&mSurfaceLock);
+ mSurface.reset(new QWaylandSurface(mDisplay));
+ connect(mSurface.data(), &QWaylandSurface::screensChanged,
+ this, &QWaylandWindow::handleScreensChanged);
+ mSurface->m_window = this;
+ }
emit wlSurfaceCreated();
}
@@ -242,6 +245,7 @@ void QWaylandWindow::reset(bool sendDestroyEvent)
mSubSurfaceWindow = nullptr;
if (mSurface) {
emit wlSurfaceDestroyed();
+ QWriteLocker lock(&mSurfaceLock);
mSurface.reset();
}
@@ -617,10 +621,11 @@ QMutex QWaylandWindow::mFrameSyncMutex;
bool QWaylandWindow::waitForFrameSync(int timeout)
{
- QMutexLocker locker(&mFrameSyncMutex);
if (!mWaitingForFrameCallback)
return true;
+ QMutexLocker locker(&mFrameSyncMutex);
+
wl_proxy_set_queue(reinterpret_cast<wl_proxy *>(mFrameCallback), mFrameQueue);
mDisplay->dispatchQueueWhile(mFrameQueue, [&]() { return mWaitingForFrameCallback; }, timeout);
@@ -1135,6 +1140,9 @@ void QWaylandWindow::requestUpdate()
void QWaylandWindow::handleUpdate()
{
// TODO: Should sync subsurfaces avoid requesting frame callbacks?
+ QReadLocker lock(&mSurfaceLock);
+ if (!mSurface)
+ return;
if (mFrameCallback) {
wl_callback_destroy(mFrameCallback);