summaryrefslogtreecommitdiffstats
path: root/event-loop.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2008-10-07 10:10:36 -0400
committerKristian Høgsberg <krh@redhat.com>2008-10-07 10:10:36 -0400
commita67a71a7cf2f6cf17cb10eeeb4e9bb867bb9eb40 (patch)
tree1ae3075a2ee614b6f4754b4135551a4e01d7614c /event-loop.c
parent33bea964cae3791cc00173b62e82089168f87804 (diff)
downloadwayland-a67a71a7cf2f6cf17cb10eeeb4e9bb867bb9eb40.tar.gz
wayland-a67a71a7cf2f6cf17cb10eeeb4e9bb867bb9eb40.tar.xz
wayland-a67a71a7cf2f6cf17cb10eeeb4e9bb867bb9eb40.zip
Bunch of new stuff: simple compositor, cairo+gem use in client, events.
Diffstat (limited to 'event-loop.c')
-rw-r--r--event-loop.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/event-loop.c b/event-loop.c
index 2946a64..96b5680 100644
--- a/event-loop.c
+++ b/event-loop.c
@@ -60,6 +60,24 @@ wl_event_loop_remove_source(struct wl_event_loop *loop,
return epoll_ctl(loop->epoll_fd, EPOLL_CTL_DEL, fd, NULL);
}
+int
+wl_event_loop_update_source(struct wl_event_loop *loop,
+ struct wl_event_source *source,
+ uint32_t mask)
+{
+ struct epoll_event ep;
+
+ ep.events = 0;
+ if (mask & WL_EVENT_READABLE)
+ ep.events |= EPOLLIN;
+ if (mask & WL_EVENT_WRITEABLE)
+ ep.events |= EPOLLOUT;
+ ep.data.ptr = source;
+
+ return epoll_ctl(loop->epoll_fd,
+ EPOLL_CTL_MOD, source->fd, &ep);
+}
+
struct wl_event_loop *
wl_event_loop_create(void)
{
@@ -93,6 +111,7 @@ wl_event_loop_wait(struct wl_event_loop *loop)
struct epoll_event ep[32];
struct wl_event_source *source;
int i, count;
+ uint32_t mask;
count = epoll_wait(loop->epoll_fd, ep, ARRAY_LENGTH(ep), -1);
if (count < 0)
@@ -100,7 +119,13 @@ wl_event_loop_wait(struct wl_event_loop *loop)
for (i = 0; i < count; i++) {
source = ep[i].data.ptr;
- source->func(source->fd, ep[i].events, source->data);
+ mask = 0;
+ if (ep[i].events & EPOLLIN)
+ mask |= WL_EVENT_READABLE;
+ if (ep[i].events & EPOLLOUT)
+ mask |= WL_EVENT_WRITEABLE;
+
+ source->func(source->fd, mask, source->data);
}
return 0;