mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-02-04 23:20:29 +01:00
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 <carlosg@gnome.org> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
36017fbd3c
commit
47e10da12a
1 changed files with 16 additions and 0 deletions
16
src/evdev.c
16
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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue