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) {
197 wl_display_cancel_read(m_wldisplay);
201 if (fds[0].revents & POLLIN)
202 wl_display_read_events(m_wldisplay);
207 wl_display_cancel_read(m_wldisplay);
212 bool waitForReading()
214 Q_ASSERT(isCurrentThread());
216 m_reading.storeRelease(
false);
218 if (m_mode == SelfDispatch) {
221 Q_EMIT needReadAndDispatch();
223 QMutexLocker lock(&m_mutex);
226 while (!m_reading.loadRelaxed() && !m_quitting.loadRelaxed())
227 m_cond.wait(&m_mutex);
230 return !m_quitting.loadRelaxed();
233 int dispatchQueuePending()
236 return wl_display_dispatch_queue_pending(m_wldisplay, m_wlevqueue);
238 return wl_display_dispatch_pending(m_wldisplay);
241 int prepareReadQueue()
244 return wl_display_prepare_read_queue(m_wldisplay, m_wlevqueue);
246 return wl_display_prepare_read(m_wldisplay);
251 wl_display *m_wldisplay;
252 wl_event_queue *m_wlevqueue;
253 OperatingMode m_mode;
256
257
258
259
260
261
262
263
264
266 QAtomicInteger<
bool> m_reading;
267 QAtomicInteger<
bool> m_quitting;
269 QWaitCondition m_cond;