diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index daa59df..3e2c98a 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -530,6 +530,9 @@ 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))) + return -EINVAL; + if (flags & LIBEVDEV_READ_SYNC) { if (!dev->need_sync && dev->queue_nsync == 0) return -EAGAIN; diff --git a/libevdev/libevdev.h b/libevdev/libevdev.h index 613d930..74c4723 100644 --- a/libevdev/libevdev.h +++ b/libevdev/libevdev.h @@ -137,7 +137,8 @@ struct libevdev; enum EvdevReadFlags { - LIBEVDEV_READ_SYNC = 1, /**< Process data in sync mode */ + LIBEVDEV_READ_SYNC = 1, /**< Process data in sync mode */ + LIBEVDEV_READ_NORMAL = 2, /**< Process data in normal mode */ }; /** diff --git a/test/test-libevdev-events.c b/test/test-libevdev-events.c index 5758d17..f23c2cc 100644 --- a/test/test-libevdev-events.c +++ b/test/test-libevdev-events.c @@ -53,12 +53,12 @@ START_TEST(test_next_event) rc = libevdev_new_from_fd(fd, &dev); ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));; - rc = libevdev_next_event(dev, 0, &ev); + rc = libevdev_next_event(dev, LIBEVDEV_READ_NORMAL, &ev); ck_assert_int_eq(rc, -EAGAIN); uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1); uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0); - rc = libevdev_next_event(dev, 0, &ev); + rc = libevdev_next_event(dev, LIBEVDEV_READ_NORMAL, &ev); ck_assert_int_eq(rc, 0); ck_assert_int_eq(ev.type, EV_KEY); ck_assert_int_eq(ev.code, BTN_LEFT); @@ -104,7 +104,7 @@ START_TEST(test_syn_event) */ uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1); uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0); - rc = libevdev_next_event(dev, 0, &ev); + rc = libevdev_next_event(dev, LIBEVDEV_READ_NORMAL, &ev); ck_assert_int_eq(rc, 0); ck_assert_int_eq(ev.type, EV_KEY); ck_assert_int_eq(ev.code, BTN_LEFT); @@ -118,14 +118,14 @@ START_TEST(test_syn_event) ev.value = 0; rc = write(pipefd[1], &ev, sizeof(ev)); ck_assert_int_eq(rc, sizeof(ev)); - rc = libevdev_next_event(dev, 0, &ev); + rc = libevdev_next_event(dev, LIBEVDEV_READ_NORMAL, &ev); libevdev_change_fd(dev, fd); ck_assert_int_eq(rc, 0); ck_assert_int_eq(ev.type, EV_SYN); ck_assert_int_eq(ev.code, SYN_REPORT); - rc = libevdev_next_event(dev, 0, &ev); + rc = libevdev_next_event(dev, LIBEVDEV_READ_NORMAL, &ev); ck_assert_int_eq(rc, 1); /* only check for the rc, nothing actually changed on the device */