From f2c8bc7e6d661283c714e154b1a92a74cf657462 Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Thu, 24 Feb 2011 12:57:59 +0100 Subject: Skip events selectively Buffer all events as planned, but strip the stream of all events involved with pointer and MT, rather than bluntly removing all events. In practise, this means button and switch events are let through, undistorted although possibly slightly delayed. Signed-off-by: Henrik Rydberg --- src/grail-api.c | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/grail-api.c b/src/grail-api.c index 255c6c2..9fa58a2 100644 --- a/src/grail-api.c +++ b/src/grail-api.c @@ -130,26 +130,59 @@ void grail_get_units(const struct grail *ge, static void flush_events(struct grail *ge) { struct grail_impl *impl = ge->impl; - struct input_event ev; + struct input_event iev; grailbuf_clear(&impl->gbuf); while (!evbuf_empty(&impl->evbuf)) { - evbuf_get(&impl->evbuf, &ev); + evbuf_get(&impl->evbuf, &iev); if (ge->event) - ge->event(ge, &ev); + ge->event(ge, &iev); + } +} + +static int skip_event(const struct input_event *ev, int count) +{ + switch (ev->type) { + case EV_ABS: + return 1; + case EV_KEY: + return ev->code >= BTN_DIGI && ev->code < BTN_WHEEL; + case EV_SYN: + switch (ev->code) { + case SYN_MT_REPORT: + return 1; + case SYN_REPORT: + return count == 0; + default: + return 0; + } + default: + return 0; } } static void flush_gestures(struct grail *ge) { struct grail_impl *impl = ge->impl; - struct grail_event ev; + struct input_event iev; + struct grail_event gev; + int count = 0; - evbuf_clear(&impl->evbuf); + while (!evbuf_empty(&impl->evbuf)) { + evbuf_get(&impl->evbuf, &iev); + if (skip_event(&iev, count)) + continue; + if (ge->event) + ge->event(ge, &iev); + if (iev.type == EV_SYN && iev.code == SYN_REPORT) + count = 0; + else + count++; + } while (!grailbuf_empty(&impl->gbuf)) { - grailbuf_get(&impl->gbuf, &ev); + grailbuf_get(&impl->gbuf, &gev); if (ge->gesture) - ge->gesture(ge, &ev); + ge->gesture(ge, &gev); } } -- cgit v1.2.3