diff options
| author | Henrik Rydberg <rydberg@euromail.se> | 2011-02-24 12:57:59 +0100 |
|---|---|---|
| committer | Henrik Rydberg <rydberg@euromail.se> | 2011-03-14 12:55:19 +0100 |
| commit | f2c8bc7e6d661283c714e154b1a92a74cf657462 (patch) | |
| tree | 3374e6d1f974e999c4ad7fedddd36eeec55a598c | |
| parent | 58492d2cd0a38b0d26ea25bddead95bb0fe1c5ce (diff) | |
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 <rydberg@euromail.se>
| -rw-r--r-- | src/grail-api.c | 47 |
1 files 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, | |||
| 130 | static void flush_events(struct grail *ge) | 130 | static void flush_events(struct grail *ge) |
| 131 | { | 131 | { |
| 132 | struct grail_impl *impl = ge->impl; | 132 | struct grail_impl *impl = ge->impl; |
| 133 | struct input_event ev; | 133 | struct input_event iev; |
| 134 | 134 | ||
| 135 | grailbuf_clear(&impl->gbuf); | 135 | grailbuf_clear(&impl->gbuf); |
| 136 | while (!evbuf_empty(&impl->evbuf)) { | 136 | while (!evbuf_empty(&impl->evbuf)) { |
| 137 | evbuf_get(&impl->evbuf, &ev); | 137 | evbuf_get(&impl->evbuf, &iev); |
| 138 | if (ge->event) | 138 | if (ge->event) |
| 139 | ge->event(ge, &ev); | 139 | ge->event(ge, &iev); |
| 140 | } | ||
| 141 | } | ||
| 142 | |||
| 143 | static int skip_event(const struct input_event *ev, int count) | ||
| 144 | { | ||
| 145 | switch (ev->type) { | ||
| 146 | case EV_ABS: | ||
| 147 | return 1; | ||
| 148 | case EV_KEY: | ||
| 149 | return ev->code >= BTN_DIGI && ev->code < BTN_WHEEL; | ||
| 150 | case EV_SYN: | ||
| 151 | switch (ev->code) { | ||
| 152 | case SYN_MT_REPORT: | ||
| 153 | return 1; | ||
| 154 | case SYN_REPORT: | ||
| 155 | return count == 0; | ||
| 156 | default: | ||
| 157 | return 0; | ||
| 158 | } | ||
| 159 | default: | ||
| 160 | return 0; | ||
| 140 | } | 161 | } |
| 141 | } | 162 | } |
| 142 | 163 | ||
| 143 | static void flush_gestures(struct grail *ge) | 164 | static void flush_gestures(struct grail *ge) |
| 144 | { | 165 | { |
| 145 | struct grail_impl *impl = ge->impl; | 166 | struct grail_impl *impl = ge->impl; |
| 146 | struct grail_event ev; | 167 | struct input_event iev; |
| 168 | struct grail_event gev; | ||
| 169 | int count = 0; | ||
| 147 | 170 | ||
| 148 | evbuf_clear(&impl->evbuf); | 171 | while (!evbuf_empty(&impl->evbuf)) { |
| 172 | evbuf_get(&impl->evbuf, &iev); | ||
| 173 | if (skip_event(&iev, count)) | ||
| 174 | continue; | ||
| 175 | if (ge->event) | ||
| 176 | ge->event(ge, &iev); | ||
| 177 | if (iev.type == EV_SYN && iev.code == SYN_REPORT) | ||
| 178 | count = 0; | ||
| 179 | else | ||
| 180 | count++; | ||
| 181 | } | ||
| 149 | while (!grailbuf_empty(&impl->gbuf)) { | 182 | while (!grailbuf_empty(&impl->gbuf)) { |
| 150 | grailbuf_get(&impl->gbuf, &ev); | 183 | grailbuf_get(&impl->gbuf, &gev); |
| 151 | if (ge->gesture) | 184 | if (ge->gesture) |
| 152 | ge->gesture(ge, &ev); | 185 | ge->gesture(ge, &gev); |
| 153 | } | 186 | } |
| 154 | } | 187 | } |
| 155 | 188 | ||
