summaryrefslogtreecommitdiffstats
path: root/src/client/qwaylanddisplay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/qwaylanddisplay.cpp')
-rw-r--r--src/client/qwaylanddisplay.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
index e39f91280..e759c5d64 100644
--- a/src/client/qwaylanddisplay.cpp
+++ b/src/client/qwaylanddisplay.cpp
@@ -225,6 +225,17 @@ void QWaylandDisplay::flushRequests()
if (wl_display_dispatch_pending(mDisplay) < 0)
checkError();
+ {
+ QReadLocker locker(&m_frameQueueLock);
+ for (const FrameQueue &q : mExternalQueues) {
+ QMutexLocker locker(q.mutex);
+ while (wl_display_prepare_read_queue(mDisplay, q.queue) != 0)
+ wl_display_dispatch_queue_pending(mDisplay, q.queue);
+ wl_display_read_events(mDisplay);
+ wl_display_dispatch_queue_pending(mDisplay, q.queue);
+ }
+ }
+
wl_display_flush(mDisplay);
}
@@ -234,6 +245,27 @@ void QWaylandDisplay::blockingReadEvents()
checkError();
}
+void QWaylandDisplay::destroyFrameQueue(const QWaylandDisplay::FrameQueue &q)
+{
+ QWriteLocker locker(&m_frameQueueLock);
+ auto it = std::find_if(mExternalQueues.begin(),
+ mExternalQueues.end(),
+ [&q] (const QWaylandDisplay::FrameQueue &other){ return other.queue == q.queue; });
+ Q_ASSERT(it != mExternalQueues.end());
+ mExternalQueues.erase(it);
+ if (q.queue != nullptr)
+ wl_event_queue_destroy(q.queue);
+ delete q.mutex;
+}
+
+QWaylandDisplay::FrameQueue QWaylandDisplay::createFrameQueue()
+{
+ QWriteLocker locker(&m_frameQueueLock);
+ FrameQueue q{createEventQueue()};
+ mExternalQueues.append(q);
+ return q;
+}
+
wl_event_queue *QWaylandDisplay::createEventQueue()
{
return wl_display_create_queue(mDisplay);