summaryrefslogtreecommitdiff
path: root/libevdev
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-07-01 10:06:55 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-07-01 10:10:25 +1000
commit2ae4dc003a0ac4c9a6cf78ac020e1e45b9c8516b (patch)
tree09bd076dc0d4c0f1154c5e76d9249124828604cb /libevdev
parent0aa639b4432d5665d0f79b12aaa727140a4cd13f (diff)
downloadlibevdev-2ae4dc003a0ac4c9a6cf78ac020e1e45b9c8516b.tar.gz
Don't deliver events that are filtered
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'libevdev')
-rw-r--r--libevdev/libevdev.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
index 14bb9e4..d85580c 100644
--- a/libevdev/libevdev.c
+++ b/libevdev/libevdev.c
@@ -556,21 +556,25 @@ int libevdev_next_event(struct libevdev *dev, unsigned int flags, struct input_e
/* Always read in some more events. Best case this smoothes over a potential SYN_DROPPED,
worst case we don't read fast enough and end up with SYN_DROPPED anyway */
- rc = read_more_events(dev);
- if (rc < 0 && rc != -EAGAIN)
- goto out;
+ do {
+ rc = read_more_events(dev);
+ if (rc < 0 && rc != -EAGAIN)
+ goto out;
- if (flags & LIBEVDEV_FORCE_SYNC) {
- dev->need_sync = 1;
- rc = 1;
- goto out;
- }
+ if (flags & LIBEVDEV_FORCE_SYNC) {
+ dev->need_sync = 1;
+ rc = 1;
+ goto out;
+ }
- if (queue_shift(dev, ev) != 0)
- return -EAGAIN;
+ if (queue_shift(dev, ev) != 0)
+ return -EAGAIN;
+
+ update_state(dev, ev);
- update_state(dev, ev);
+ /* if we disabled a code, get the next event instead */
+ } while(!libevdev_has_event_code(dev, ev->type, ev->code));
rc = 0;
if (ev->type == EV_SYN && ev->code == SYN_DROPPED) {