diff options
author | Kristian Høgsberg <krh@redhat.com> | 2008-10-07 10:10:36 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2008-10-07 10:10:36 -0400 |
commit | a67a71a7cf2f6cf17cb10eeeb4e9bb867bb9eb40 (patch) | |
tree | 1ae3075a2ee614b6f4754b4135551a4e01d7614c /event-loop.c | |
parent | 33bea964cae3791cc00173b62e82089168f87804 (diff) | |
download | wayland-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.c | 27 |
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; |