Commit 85c9b767 authored by Lucas Stach's avatar Lucas Stach Committed by Tim-Philipp Müller

gl/wayland: fix glib mainloop integration

Implement the prepare and check functions according to the
documentation by returning TRUE when events should be dispatched
via the dispatch function.

As wl_display_read_events never blocks we can call it unconditionally
without looking at the poll status.

This simplifies the implementation and gets rid of a race where the
mainloop could get blocked due to nobody actually reading the events
from the wayland connection.
parent 53214e47
......@@ -128,19 +128,13 @@ wayland_event_source_prepare (GSource * base, gint * timeout)
wl_display_cancel_read (source->display);
if (source->queue) {
while (wl_display_prepare_read_queue (source->display, source->queue) != 0) {
if (wl_display_dispatch_queue_pending (source->display,
source->queue) < 0) {
g_critical ("Failed to dispatch pending events\n");
}
}
if (wl_display_prepare_read_queue (source->display, source->queue) != 0)
return TRUE;
} else {
while (wl_display_prepare_read (source->display) != 0) {
if (wl_display_dispatch_pending (source->display) < 0) {
g_critical ("Failed to dispatch pending events\n");
}
}
if (wl_display_prepare_read (source->display) != 0)
return TRUE;
}
source->reading = TRUE;
/* FIXME: this may return EAGAIN if the fd is full */
......@@ -154,18 +148,13 @@ static gboolean
wayland_event_source_check (GSource * base)
{
WaylandEventSource *source = (WaylandEventSource *) base;
gboolean retval;
retval = source->pfd.revents;
if (source->pfd.revents & G_IO_IN) {
wl_display_read_events (source->display);
} else {
wl_display_cancel_read (source->display);
}
source->reading = FALSE;
return retval;
if (wl_display_read_events (source->display) == 0)
return TRUE;
return FALSE;
}
static gboolean
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment