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"));
105 if (qt_safe_pipe(m_pipefd) != 0)
106 qErrnoWarning(
"Pipe creation failed. Quitting may hang.");
112 Q_ASSERT(!isRunning());
114 if (m_pipefd[0] != -1) {
115 qt_safe_close(m_pipefd[0]);
116 qt_safe_close(m_pipefd[1]);
123
124
125
126
127
128
129
130
131 if (m_quitting.loadRelaxed())
135 if (dispatchQueuePending() < 0) {
136 Q_EMIT waylandError();
137 QMutexLocker lock(&m_mutex);
138 m_quitting.storeRelaxed(
true);
143 wl_display_flush(m_wldisplay);
147 if (m_reading.loadAcquire())
150 if (prepareReadQueue() == 0) {
151 QMutexLocker l(&m_mutex);
152 m_reading.storeRelease(
true);
163 if (m_pipefd[1] != -1 && qt_safe_write(m_pipefd[1],
"\0", 1) == -1)
164 qErrnoWarning(
"Failed to write to the pipe");
169 QMutexLocker lock(&m_mutex);
170 m_quitting.storeRelaxed(
true);
186 while (waitForReading()) {
187 if (!m_reading.loadRelaxed())
191 pollfd fds[2] = { { m_fd, POLLIN, 0 }, { m_pipefd[0], POLLIN, 0 } };
194 if (fds[1].revents & POLLIN) {
196 wl_display_cancel_read(m_wldisplay);
200 if (fds[0].revents & POLLIN)
201 wl_display_read_events(m_wldisplay);
206 wl_display_cancel_read(m_wldisplay);
211 bool waitForReading()
213 Q_ASSERT(QThread::currentThread() ==
this);
215 m_reading.storeRelease(
false);
217 if (m_mode == SelfDispatch) {
220 Q_EMIT needReadAndDispatch();
222 QMutexLocker lock(&m_mutex);
225 while (!m_reading.loadRelaxed() && !m_quitting.loadRelaxed())
226 m_cond.wait(&m_mutex);
229 return !m_quitting.loadRelaxed();
232 int dispatchQueuePending()
235 return wl_display_dispatch_queue_pending(m_wldisplay, m_wlevqueue);
237 return wl_display_dispatch_pending(m_wldisplay);
240 int prepareReadQueue()
243 return wl_display_prepare_read_queue(m_wldisplay, m_wlevqueue);
245 return wl_display_prepare_read(m_wldisplay);
250 wl_display *m_wldisplay;
251 wl_event_queue *m_wlevqueue;
252 OperatingMode m_mode;
255
256
257
258
259
260
261
262
263
265 QAtomicInteger<
bool> m_reading;
266 QAtomicInteger<
bool> m_quitting;
268 QWaitCondition m_cond;