90 struct wl_event_queue * ev_queue,
92 QObject *parent =
nullptr)
94 , m_fd(wl_display_get_fd(wl))
97 , m_wlevqueue(ev_queue)
102 setObjectName(QStringLiteral(
"WaylandEventThread"));
106 if (qt_safe_pipe(m_pipefd) != 0)
107 qErrnoWarning(
"Pipe creation failed. Quitting may hang.");
113 Q_ASSERT(!isRunning());
115 if (m_pipefd[0] != -1) {
116 qt_safe_close(m_pipefd[0]);
117 qt_safe_close(m_pipefd[1]);
124
125
126
127
128
129
130
131
132 if (m_quitting.loadRelaxed())
136 if (dispatchQueuePending() < 0) {
137 Q_EMIT waylandError();
138 QMutexLocker lock(&m_mutex);
139 m_quitting.storeRelaxed(
true);
144 wl_display_flush(m_wldisplay);
148 if (m_reading.loadAcquire())
151 if (prepareReadQueue() == 0) {
152 QMutexLocker l(&m_mutex);
153 m_reading.storeRelease(
true);
164 if (m_pipefd[1] != -1 && qt_safe_write(m_pipefd[1],
"\0", 1) == -1)
165 qErrnoWarning(
"Failed to write to the pipe");
170 QMutexLocker lock(&m_mutex);
171 m_quitting.storeRelaxed(
true);
187 while (waitForReading()) {
188 if (!m_reading.loadRelaxed())
192 pollfd fds[2] = { { m_fd, POLLIN, 0 }, { m_pipefd[0], POLLIN, 0 } };
195 if (fds[1].revents & POLLIN) {
201 if (fds[0].revents & POLLIN)
202 wl_display_read_events(m_wldisplay);
207 wl_display_cancel_read(m_wldisplay);
212 if (m_reading.loadAcquire())
213 wl_display_cancel_read(m_wldisplay);
217 bool waitForReading()
219 Q_ASSERT(isCurrentThread());
221 m_reading.storeRelease(
false);
223 if (m_mode == SelfDispatch) {
226 Q_EMIT needReadAndDispatch();
228 QMutexLocker lock(&m_mutex);
231 while (!m_reading.loadRelaxed() && !m_quitting.loadRelaxed())
232 m_cond.wait(&m_mutex);
235 return !m_quitting.loadRelaxed();
238 int dispatchQueuePending()
241 return wl_display_dispatch_queue_pending(m_wldisplay, m_wlevqueue);
243 return wl_display_dispatch_pending(m_wldisplay);
246 int prepareReadQueue()
249 return wl_display_prepare_read_queue(m_wldisplay, m_wlevqueue);
251 return wl_display_prepare_read(m_wldisplay);
256 wl_display *m_wldisplay;
257 wl_event_queue *m_wlevqueue;
258 OperatingMode m_mode;
261
262
263
264
265
266
267
268
269
271 QAtomicInteger<
bool> m_reading;
272 QAtomicInteger<
bool> m_quitting;
274 QWaitCondition m_cond;