89 struct wl_event_queue * ev_queue,
91 QObject *parent =
nullptr)
93 , m_fd(wl_display_get_fd(wl))
96 , m_wlevqueue(ev_queue)
101 setObjectName(QStringLiteral(
"WaylandEventThread"));
107
108
109
110
111
112
113
114
115 if (m_quitting.loadRelaxed())
119 if (dispatchQueuePending() < 0) {
120 Q_EMIT waylandError();
121 m_quitting.storeRelaxed(
true);
125 wl_display_flush(m_wldisplay);
129 if (m_reading.loadAcquire())
132 if (prepareReadQueue() == 0) {
133 QMutexLocker l(&m_mutex);
134 m_reading.storeRelease(
true);
145 if (m_pipefd[1] != -1 && write(m_pipefd[1],
"\0", 1) == -1)
146 qWarning(
"Failed to write to the pipe: %s.", strerror(errno));
148 m_quitting.storeRelaxed(
true);
168 if (qt_safe_pipe(fds) != 0)
169 qWarning(
"Pipe creation failed. Quitting may hang.");
186 while (waitForReading()) {
187 if (!m_reading.loadRelaxed())
190 pollfd fds[2] = { { m_fd, POLLIN, 0 }, { m_pipefd[0], POLLIN, 0 } };
193 if (fds[1].revents & POLLIN) {
195 wl_display_cancel_read(m_wldisplay);
199 if (fds[0].revents & POLLIN)
200 wl_display_read_events(m_wldisplay);
205 wl_display_cancel_read(m_wldisplay);
210 bool waitForReading()
212 Q_ASSERT(QThread::currentThread() ==
this);
214 m_reading.storeRelease(
false);
216 if (m_mode == SelfDispatch) {
219 Q_EMIT needReadAndDispatch();
221 QMutexLocker lock(&m_mutex);
224 while (!m_reading.loadRelaxed() && !m_quitting.loadRelaxed())
225 m_cond.wait(&m_mutex);
228 return !m_quitting.loadRelaxed();
231 int dispatchQueuePending()
234 return wl_display_dispatch_queue_pending(m_wldisplay, m_wlevqueue);
236 return wl_display_dispatch_pending(m_wldisplay);
239 int prepareReadQueue()
242 return wl_display_prepare_read_queue(m_wldisplay, m_wlevqueue);
244 return wl_display_prepare_read(m_wldisplay);
249 wl_display *m_wldisplay;
250 wl_event_queue *m_wlevqueue;
251 OperatingMode m_mode;
254
255
256
257
258
259
260
262 QAtomicInteger<
bool> m_reading;
263 QAtomicInteger<
bool> m_quitting;
265 QWaitCondition m_cond;