From 2a20d83fdb8a9513e3ced35712e62826eac431be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Sun, 2 Nov 2008 17:22:39 -0500 Subject: [PATCH] Always poll on display fd so we only read when there's data. --- background.c | 4 ++++ pointer.c | 32 +++++++++++++++++++++++++------- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/background.c b/background.c index 5c7775fe..19748ebe 100644 --- a/background.c +++ b/background.c @@ -126,6 +126,10 @@ int main(int argc, char *argv[]) display = wl_display_create(socket_name, connection_update, &p[0]); + if (display == NULL) { + fprintf(stderr, "failed to create display: %m\n"); + return -1; + } p[0].fd = wl_display_get_fd(display); surface = wl_display_create_surface(display); diff --git a/pointer.c b/pointer.c index e9b9b9ee..d534a56c 100644 --- a/pointer.c +++ b/pointer.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -130,6 +131,14 @@ static int connection_update(struct wl_connection *connection, uint32_t mask, void *data) { + struct pollfd *p = data; + + p->events = 0; + if (mask & WL_CONNECTION_READABLE) + p->events |= POLLIN; + if (mask & WL_CONNECTION_WRITABLE) + p->events |= POLLOUT; + return 0; } @@ -144,7 +153,8 @@ void event_handler(struct wl_display *display, { struct pointer *pointer = data; - wl_surface_map(pointer->surface, arg1, arg2, pointer->width, pointer->height); + if (opcode == 0) + wl_surface_map(pointer->surface, arg1, arg2, pointer->width, pointer->height); } int main(int argc, char *argv[]) @@ -152,8 +162,9 @@ int main(int argc, char *argv[]) struct wl_display *display; struct pointer pointer; int fd; - uint32_t name; + uint32_t name, mask; cairo_surface_t *s; + struct pollfd p[1]; fd = open(gem_device, O_RDWR); if (fd < 0) { @@ -162,11 +173,12 @@ int main(int argc, char *argv[]) } display = wl_display_create(socket_name, - connection_update, NULL); + connection_update, &p[0]); if (display == NULL) { fprintf(stderr, "failed to create display: %m\n"); return -1; } + p[0].fd = wl_display_get_fd(display); pointer.width = 16; pointer.height = 16; @@ -178,13 +190,19 @@ int main(int argc, char *argv[]) wl_surface_attach(pointer.surface, name, pointer.width, pointer.height, cairo_image_surface_get_stride(s)); + wl_surface_map(pointer.surface, 512, 384, pointer.width, pointer.height); wl_display_set_event_handler(display, event_handler, &pointer); - while (1) - wl_display_iterate(display, - WL_CONNECTION_WRITABLE | - WL_CONNECTION_READABLE); + while (1) { + poll(p, 1, -1); + mask = 0; + if (p[0].revents & POLLIN) + mask |= WL_CONNECTION_READABLE; + if (p[0].revents & POLLOUT) + mask |= WL_CONNECTION_WRITABLE; + wl_display_iterate(display, mask); + } return 0; }