Re: [PATCH libinput 3/8] Add libinput_device_suspend() and libinput_device_resume()
On Wed, Aug 20, 2014 at 01:18:51PM +1000, Peter Hutterer wrote: 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; + We'd need to reset the button/key bitmask here, as it is only updated when reading actual evdev events. Note to self: that mask and its friends should probably be prefixed with hw_ to make it easier to understand that they represent the observed hardware state. Jonas + 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
Re: [PATCH libinput 3/8] Add libinput_device_suspend() and libinput_device_resume()
On Thu, Aug 21, 2014 at 09:36:57PM +0200, Jonas Ådahl wrote: On Wed, Aug 20, 2014 at 01:18:51PM +1000, Peter Hutterer wrote: 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; + We'd need to reset the button/key bitmask here, as it is only updated when reading actual evdev events. Note to self: that mask and its friends should probably be prefixed with hw_ to make it easier to understand that they represent the observed hardware state. will do, got the hw prefix patch locally now too. Cheers, Peter + 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
[PATCH libinput 3/8] Add libinput_device_suspend() and libinput_device_resume()
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