Don't use poll timeout for timing animation.
Receiving events breaks out of the poll and resets the time out. Effectively, this blocks the animation when the client receives events. As a quick fix, use timerfd for timing the animation.
This commit is contained in:
parent
5a27f3e6a7
commit
d3fa34ca29
2
Makefile
2
Makefile
|
@ -21,7 +21,7 @@ flower_objs = flower.o
|
||||||
pointer_objs = pointer.o
|
pointer_objs = pointer.o
|
||||||
|
|
||||||
$(clients) : CFLAGS += $(shell pkg-config --cflags cairo)
|
$(clients) : CFLAGS += $(shell pkg-config --cflags cairo)
|
||||||
$(clients) : LDLIBS += $(shell pkg-config --libs cairo)
|
$(clients) : LDLIBS += $(shell pkg-config --libs cairo) -lrt
|
||||||
|
|
||||||
define client_template
|
define client_template
|
||||||
$(1): $$($(1)_objs) libwayland.so
|
$(1): $$($(1)_objs) libwayland.so
|
||||||
|
|
32
flower.c
32
flower.c
|
@ -5,6 +5,8 @@
|
||||||
#include <i915_drm.h>
|
#include <i915_drm.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/poll.h>
|
#include <sys/poll.h>
|
||||||
|
#include <sys/timerfd.h>
|
||||||
|
#include <time.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
@ -151,9 +153,10 @@ int main(int argc, char *argv[])
|
||||||
int fd, i, ret;
|
int fd, i, ret;
|
||||||
uint32_t name, mask;
|
uint32_t name, mask;
|
||||||
cairo_surface_t *s;
|
cairo_surface_t *s;
|
||||||
struct pollfd p[1];
|
struct pollfd p[2];
|
||||||
|
struct timespec ts;
|
||||||
srandom(time(NULL));
|
struct itimerspec its;
|
||||||
|
uint64_t expires;
|
||||||
|
|
||||||
fd = open(gem_device, O_RDWR);
|
fd = open(gem_device, O_RDWR);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
|
@ -171,6 +174,24 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
surface = wl_display_create_surface(display);
|
surface = wl_display_create_surface(display);
|
||||||
|
|
||||||
|
p[1].fd = timerfd_create(CLOCK_MONOTONIC, 0);
|
||||||
|
if (p[1].fd < 0) {
|
||||||
|
fprintf(stderr, "could not create timerfd\n: %m");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
p[1].events = POLLIN;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &ts);
|
||||||
|
its.it_value = ts;
|
||||||
|
its.it_interval.tv_sec = 0;
|
||||||
|
its.it_interval.tv_nsec = 20 * 1000000;
|
||||||
|
if (timerfd_settime(p[1].fd, TFD_TIMER_ABSTIME, &its, NULL) < 0) {
|
||||||
|
fprintf(stderr, "could not set timerfd\n: %m");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
srandom(ts.tv_nsec);
|
||||||
|
|
||||||
s = draw_stuff(width, height);
|
s = draw_stuff(width, height);
|
||||||
name = name_cairo_surface(fd, s);
|
name = name_cairo_surface(fd, s);
|
||||||
|
|
||||||
|
@ -178,8 +199,9 @@ int main(int argc, char *argv[])
|
||||||
cairo_image_surface_get_stride(s));
|
cairo_image_surface_get_stride(s));
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
while (ret = poll(p, 1, 20), ret >= 0) {
|
while (ret = poll(p, 2, -1), ret >= 0) {
|
||||||
if (ret == 0) {
|
if (p[1].revents & POLLIN) {
|
||||||
|
read(p[1].fd, &expires, sizeof expires);
|
||||||
wl_surface_map(surface,
|
wl_surface_map(surface,
|
||||||
x + cos(i / 30.0) * 200,
|
x + cos(i / 30.0) * 200,
|
||||||
y + sin(i / 31.0) * 200,
|
y + sin(i / 31.0) * 200,
|
||||||
|
|
Loading…
Reference in New Issue