[PATCH v2 libinput 1/2] evdev: Ensure the libevdev object receives the new fd on resume
Peter Hutterer
peter.hutterer at who-t.net
Tue Dec 9 17:47:35 PST 2014
From: Carlos Garnacho <carlosg at gnome.org>
Otherwise, input_events will be attempted to read from the wrong place,
which also leaves the right/current fd with pending data to be read,
making the epoll fd wake up constantly.
Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
Changes to v1:
- sync libevdev's state after change_fd
src/evdev.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/src/evdev.c b/src/evdev.c
index 0873c99..3f15560 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -1985,6 +1985,8 @@ evdev_device_resume(struct evdev_device *device)
struct libinput *libinput = device->base.seat->libinput;
int fd;
const char *devnode;
+ struct input_event ev;
+ enum libevdev_read_status status;
if (device->fd != -1)
return 0;
@@ -2011,6 +2013,20 @@ evdev_device_resume(struct evdev_device *device)
return -ENODEV;
}
+ libevdev_change_fd(device->evdev, fd);
+ libevdev_set_clock_id(device->evdev, CLOCK_MONOTONIC);
+
+ /* re-sync libevdev's view of the device, but discard the actual
+ events. Our device is in a neutral state already */
+ libevdev_next_event(device->evdev,
+ LIBEVDEV_READ_FLAG_FORCE_SYNC,
+ &ev);
+ do {
+ status = libevdev_next_event(device->evdev,
+ LIBEVDEV_READ_FLAG_SYNC,
+ &ev);
+ } while (status == LIBEVDEV_READ_STATUS_SYNC);
+
device->source =
libinput_add_fd(libinput, fd, evdev_device_dispatch, device);
if (!device->source) {
--
2.1.0
More information about the wayland-devel
mailing list