diff options
| author | Kristian Høgsberg <krh@redhat.com> | 2008-11-02 17:22:39 -0500 |
|---|---|---|
| committer | Kristian Høgsberg <krh@redhat.com> | 2008-11-06 10:53:02 -0500 |
| commit | 2a20d83fdb8a9513e3ced35712e62826eac431be (patch) | |
| tree | cb0cf27633c362d48f9108d673bd05cb460bddef /pointer.c | |
| parent | Move background drawing to a client. (diff) | |
| download | wayland-2a20d83fdb8a9513e3ced35712e62826eac431be.tar wayland-2a20d83fdb8a9513e3ced35712e62826eac431be.tar.gz wayland-2a20d83fdb8a9513e3ced35712e62826eac431be.tar.bz2 wayland-2a20d83fdb8a9513e3ced35712e62826eac431be.tar.lz wayland-2a20d83fdb8a9513e3ced35712e62826eac431be.tar.xz wayland-2a20d83fdb8a9513e3ced35712e62826eac431be.tar.zst wayland-2a20d83fdb8a9513e3ced35712e62826eac431be.zip | |
Always poll on display fd so we only read when there's data.
Diffstat (limited to 'pointer.c')
| -rw-r--r-- | pointer.c | 32 |
1 files changed, 25 insertions, 7 deletions
@@ -4,6 +4,7 @@ #include <string.h> #include <i915_drm.h> #include <sys/ioctl.h> +#include <sys/poll.h> #include <fcntl.h> #include <unistd.h> #include <math.h> @@ -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; } |
