[PATCH libinput 3/8] Add libinput_device_suspend() and libinput_device_resume()

Peter Hutterer peter.hutterer at who-t.net
Thu Aug 21 17:43:34 PDT 2014


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.hutterer at 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 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 at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list