parent
7f77bd8fbe
commit
fb59084fbf
@ -0,0 +1,83 @@ |
|||||||
|
#include <stdint.h> |
||||||
|
#include <glib/giochannel.h> |
||||||
|
#include "wayland-client.h" |
||||||
|
#include "wayland-glib.h" |
||||||
|
|
||||||
|
struct _WaylandSource { |
||||||
|
GSource source; |
||||||
|
GPollFD pfd; |
||||||
|
uint32_t mask; |
||||||
|
struct wl_display *display; |
||||||
|
}; |
||||||
|
|
||||||
|
static gboolean |
||||||
|
wayland_source_prepare(GSource *base, gint *timeout) |
||||||
|
{ |
||||||
|
WaylandSource *source = (WaylandSource *) base; |
||||||
|
|
||||||
|
*timeout = -1; |
||||||
|
|
||||||
|
/* We have to add/remove the GPollFD if we want to update our
|
||||||
|
* poll event mask dynamically. Instead, let's just flush all |
||||||
|
* write on idle instead, which is what this amounts to. */ |
||||||
|
|
||||||
|
while (source->mask & WL_DISPLAY_WRITABLE) |
||||||
|
wl_display_iterate(source->display, |
||||||
|
WL_DISPLAY_WRITABLE); |
||||||
|
|
||||||
|
return FALSE; |
||||||
|
} |
||||||
|
|
||||||
|
static gboolean |
||||||
|
wayland_source_check(GSource *base) |
||||||
|
{ |
||||||
|
WaylandSource *source = (WaylandSource *) base; |
||||||
|
|
||||||
|
return source->pfd.revents; |
||||||
|
} |
||||||
|
|
||||||
|
static gboolean |
||||||
|
wayland_source_dispatch(GSource *base, |
||||||
|
GSourceFunc callback, |
||||||
|
gpointer data) |
||||||
|
{ |
||||||
|
WaylandSource *source = (WaylandSource *) base; |
||||||
|
|
||||||
|
wl_display_iterate(source->display, |
||||||
|
WL_DISPLAY_READABLE | WL_DISPLAY_WRITABLE); |
||||||
|
|
||||||
|
return TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
static GSourceFuncs wayland_source_funcs = { |
||||||
|
wayland_source_prepare, |
||||||
|
wayland_source_check, |
||||||
|
wayland_source_dispatch, |
||||||
|
NULL |
||||||
|
}; |
||||||
|
|
||||||
|
static int |
||||||
|
wayland_source_update(uint32_t mask, void *data) |
||||||
|
{ |
||||||
|
WaylandSource *source = data; |
||||||
|
|
||||||
|
source->mask = mask; |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
GSource * |
||||||
|
wayland_source_new(struct wl_display *display) |
||||||
|
{ |
||||||
|
WaylandSource *source; |
||||||
|
|
||||||
|
source = (WaylandSource *) g_source_new(&wayland_source_funcs, |
||||||
|
sizeof (WaylandSource)); |
||||||
|
source->display = display; |
||||||
|
source->pfd.fd = wl_display_get_fd(display, |
||||||
|
wayland_source_update, source); |
||||||
|
source->pfd.events = G_IO_IN | G_IO_ERR; |
||||||
|
g_source_add_poll(&source->source, &source->pfd); |
||||||
|
|
||||||
|
return &source->source; |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
#ifndef _WAYLAND_GLIB_H_ |
||||||
|
#define _WAYLAND_GLIB_H_ |
||||||
|
|
||||||
|
#include <glib/gmain.h> |
||||||
|
|
||||||
|
typedef struct _WaylandSource WaylandSource; |
||||||
|
|
||||||
|
GSource *wayland_source_new(struct wl_display *display); |
||||||
|
|
||||||
|
#endif |
Loading…
Reference in new issue