diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index 3e2c98a..5dd6bdb 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -530,7 +530,7 @@ int libevdev_next_event(struct libevdev *dev, unsigned int flags, struct input_e if (dev->fd < 0) return -ENODEV; - if (!(flags & (LIBEVDEV_READ_NORMAL|LIBEVDEV_READ_SYNC))) + if (!(flags & (LIBEVDEV_READ_NORMAL|LIBEVDEV_READ_SYNC|LIBEVDEV_FORCE_SYNC))) return -EINVAL; if (flags & LIBEVDEV_READ_SYNC) { @@ -558,6 +558,13 @@ int libevdev_next_event(struct libevdev *dev, unsigned int flags, struct input_e if (rc < 0 && rc != -EAGAIN) goto out; + if (flags & LIBEVDEV_FORCE_SYNC) { + dev->need_sync = 1; + rc = 1; + goto out; + } + + if (queue_shift(dev, ev) != 0) return -EAGAIN; diff --git a/libevdev/libevdev.h b/libevdev/libevdev.h index 0cf6295..d9f1daa 100644 --- a/libevdev/libevdev.h +++ b/libevdev/libevdev.h @@ -189,6 +189,9 @@ struct libevdev; enum EvdevReadFlags { LIBEVDEV_READ_SYNC = 1, /**< Process data in sync mode */ LIBEVDEV_READ_NORMAL = 2, /**< Process data in normal mode */ + LIBEVDEV_FORCE_SYNC = 4, /**< Pretend the next event is a SYN_DROPPED. There is + no reason to ever use this except for + automated tests, so don't. */ }; /**