Does what it says on the box, preventing events from the device without actually dropping the device from the context.
Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> --- See my notes in the coverletter. For the T440 case I specifically did not mention that _suspend() closes the file descriptors. src/evdev.c | 23 +++++++++++++++++++++++ src/evdev.h | 3 +++ src/libinput.c | 16 ++++++++++++++++ src/libinput.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+) diff --git a/src/evdev.c b/src/evdev.c index d4a4a07..78d9985 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -1082,6 +1082,29 @@ evdev_device_suspend(struct evdev_device *device) return 0; } +int +evdev_device_resume(struct evdev_device *device) +{ + struct libinput *libinput = device->base.seat->libinput; + int fd; + + if (device->fd != -1) + return 0; + + fd = open_restricted(libinput, device->devnode, O_RDWR | O_NONBLOCK); + + if (fd < 0) + return fd; + + device->fd = fd; + device->source = + libinput_add_fd(libinput, fd, evdev_device_dispatch, device); + if (!device->source) + return -ENOMEM; + + return 0; +} + void evdev_device_remove(struct evdev_device *device) { diff --git a/src/evdev.h b/src/evdev.h index 05125b7..b4749b6 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -182,6 +182,9 @@ evdev_device_transform_y(struct evdev_device *device, int evdev_device_suspend(struct evdev_device *device); +int +evdev_device_resume(struct evdev_device *device); + void evdev_keyboard_notify_key(struct evdev_device *device, uint32_t time, diff --git a/src/libinput.c b/src/libinput.c index 90b6a13..d18d9b8 100644 --- a/src/libinput.c +++ b/src/libinput.c @@ -1142,6 +1142,22 @@ libinput_suspend(struct libinput *libinput) libinput->interface_backend->suspend(libinput); } +LIBINPUT_EXPORT int +libinput_device_suspend(struct libinput_device *device) +{ + struct evdev_device *dev = (struct evdev_device*)device; + + return evdev_device_suspend(dev); +} + +LIBINPUT_EXPORT int +libinput_device_resume(struct libinput_device *device) +{ + struct evdev_device *dev = (struct evdev_device*)device; + + return evdev_device_resume(dev); +} + LIBINPUT_EXPORT void libinput_device_set_user_data(struct libinput_device *device, void *user_data) { diff --git a/src/libinput.h b/src/libinput.h index 9296a35..338a08f 100644 --- a/src/libinput.h +++ b/src/libinput.h @@ -1226,6 +1226,51 @@ libinput_device_unref(struct libinput_device *device); /** * @ingroup device * + * Suspend the device but do not remove the device from the context. + * Suspending a device stops the device from generating events until it is + * either resumed with libinput_device_resume() or removed from the context. + * Suspending a device does not generate a @ref + * LIBINPUT_EVENT_DEVICE_REMOVED event. + * + * Events already received and processed from this device are unaffected and + * will be passed to the caller on the next call to libinput_get_event(). + * When the device is suspended, it may generate events to reset it into a + * neutral state (e.g. releasing currently pressed buttons). + * + * If the device is already suspended, this function does nothing. + * + * @param device A previously obtained device + * @return 0 on success or a negative errno on failure + * + * @see libinput_device_resume + */ +int +libinput_device_suspend(struct libinput_device *device); + +/** + * @ingroup device + * + * Resume a previously suspended device. Events from this device will be + * processed in the next call of libinput_dispatch(). + * Resuming a device does not generate a @ref LIBINPUT_EVENT_DEVICE_ADDED + * event. + * + * When the device is resumed, it may generate events to match the logical + * state with the current physical state of the device. + * + * If the device is not currently suspended, this function does nothing. + * + * @param device A previously suspended device + * @return 0 on success or a negative errno on failure + * + * @see libinput_device_suspend + */ +int +libinput_device_resume(struct libinput_device *device); + +/** + * @ingroup device + * * Set caller-specific data associated with this input device. libinput does * not manage, look at, or modify this data. The caller must ensure the * data is valid. -- 1.9.3 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel