From 47e10da12a31817474b5d291d3822154e87a4417 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 9 Dec 2014 15:55:32 +0100 Subject: [PATCH] evdev: Ensure the libevdev object receives the new fd on resume 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 Reviewed-by: Peter Hutterer Signed-off-by: Peter Hutterer --- src/evdev.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/evdev.c b/src/evdev.c index b32db684..dce035ac 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1986,6 +1986,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; @@ -2012,6 +2014,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) {