summaryrefslogtreecommitdiff
path: root/src/evemu.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/evemu.c')
-rw-r--r--src/evemu.c41
1 files changed, 28 insertions, 13 deletions
diff --git a/src/evemu.c b/src/evemu.c
index e297b4d..f06c64a 100644
--- a/src/evemu.c
+++ b/src/evemu.c
@@ -361,25 +361,40 @@ int evemu_read_event(FILE *fp, struct input_event *ev)
361 return ret; 361 return ret;
362} 362}
363 363
364int evemu_play(FILE *fp, int fd) 364int evemu_read_event_realtime(FILE *fp, struct input_event *ev,
365 struct timeval *evtime)
365{ 366{
366 struct input_event prev, ev; 367 unsigned long usec;
367 long check = 0, usec;
368 int ret; 368 int ret;
369 369
370 memset(&prev, 0, sizeof(prev)); 370 ret = evemu_read_event(fp, ev);
371 while (evemu_read_event(fp, &ev) > 0) { 371 if (ret <= 0)
372 if (!prev.time.tv_sec) 372 return ret;
373 prev = ev; 373
374 usec = 1000000L * (ev.time.tv_sec - prev.time.tv_sec); 374 if (evtime) {
375 usec += ev.time.tv_usec - prev.time.tv_usec; 375 if (!evtime->tv_sec)
376 if (usec - check > 500) { 376 *evtime = ev->time;
377 usleep(usec - check); 377 usec = 1000000L * (ev->time.tv_sec - evtime->tv_sec);
378 check = usec; 378 usec += ev->time.tv_usec - evtime->tv_usec;
379 if (usec > 500) {
380 usleep(usec);
381 *evtime = ev->time;
379 } 382 }
380 SYSCALL(ret = write(fd, &ev, sizeof(ev)));
381 } 383 }
382 384
385 return ret;
386}
387
388int evemu_play(FILE *fp, int fd)
389{
390 struct input_event ev;
391 struct timeval evtime;
392 int ret;
393
394 memset(&evtime, 0, sizeof(evtime));
395 while (evemu_read_event_realtime(fp, &ev, &evtime) > 0)
396 SYSCALL(ret = write(fd, &ev, sizeof(ev)));
397
383 return 0; 398 return 0;
384} 399}
385 400