[PATCH libinput] Make touch event slots seat wide

Jonas Ådahl jadahl at gmail.com
Mon Feb 10 02:03:48 PST 2014


On Mon, Feb 10, 2014 at 07:47:00PM +1000, Peter Hutterer wrote:
> On Mon, Feb 10, 2014 at 10:11:47AM +0100, Jonas Ådahl wrote:
> > On Mon, Feb 10, 2014 at 03:13:55PM +1000, Peter Hutterer wrote:
> > > On Thu, Feb 06, 2014 at 10:27:54PM +0100, Jonas Ådahl wrote:
> > > > Since a Wayland compositor have to represent all touch devices of a seat
> > > > as one virtual device, lets make that easier by making the slots of
> > > > touch events seat wide unique.
> > > 
> > > is this really something we want to expose from libinput? it seems odd,
> > > given that everything else is per-device and even seats themselves are
> > > almost second-class citizens - i.e. you don't have to care about them at all
> > > if you don't need them.
> > > 
> > > I don't think tying slot number to seats is a good idea here.
> > 
> > I think it could be good to have libinput help out with virtual seat
> > devices, such as ways to avoid double button and key presses,
> > overlapping touch point slots, etc, as this is as well something that
> > would otherwise need to be duplicated in almost every (seat aware)
> > application.
> > 
> > Regarding seat slots, it's more convenient to manage these in libinput
> > since we already do keep track of per slot state, and with this patch,
> > at least weston doesn't need to be aware of per-device slots at all.
> > 
> > What do you think of providing this but not via the _get_slot()
> > function?
> 
> I fully agree that we should abstract this. something like
>     libinput_event_pointer_get_seat_button()
>     libinput_event_touch_get_seat_slot()

Well, a button is always that button, what matters if it should be
"ignored" or not. One idea I had was to have something like

libinput_event_(pointer|touch|keyboard)_is_seat_event() (or without per
event type namespacing).

That would mean a button/touch/key press/release should be considered to
be a "seat" event i.e. equivalent to a button press on a hypothetical
virtual device.

I'll resend the patch adding a _get_seat_slot().

> 
> would probably work and provide essentially the same API depending on the
> use-case. the only other option I can come up with right now is having a
> wl_pointer-like fake device in the list, but that seems about as insane as
> XI2 :)

Yea, probably overkill with virtual devices.

Jonas

> 
> > As a side note, making slots seat wide does not make them any less
> > device wide.
> 
> of course. what it does change though is that if we add a function to
> retrieve the number of simultaneous touches (i.e. slots) per device, this
> wouldn't map easily anymore and would in fact be rather unpredictable (since
> it depends on the number of devices).
> 
> Cheers,
>    Peter
> 
> 
> > > > 
> > > > Signed-off-by: Jonas Ådahl <jadahl at gmail.com>
> > > > ---
> > > >  src/evdev.c            | 24 +++++++++++++++++++++---
> > > >  src/evdev.h            |  3 +++
> > > >  src/libinput-private.h |  1 +
> > > >  src/libinput.h         |  4 ++--
> > > >  4 files changed, 27 insertions(+), 5 deletions(-)
> > > > 
> > > > diff --git a/src/evdev.c b/src/evdev.c
> > > > index 2bc301b..80210fb 100644
> > > > --- a/src/evdev.c
> > > > +++ b/src/evdev.c
> > > > @@ -109,7 +109,9 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
> > > >  {
> > > >  	int32_t cx, cy;
> > > >  	int slot;
> > > > +	uint32_t seat_slot;
> > > >  	struct libinput_device *base = &device->base;
> > > > +	struct libinput_seat *seat = base->seat;
> > > >  
> > > >  	slot = device->mt.slot;
> > > >  
> > > > @@ -128,9 +130,13 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
> > > >  		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
> > > >  			break;
> > > >  
> > > > +		seat_slot = ffs(~seat->slot_map) - 1;
> > > > +		device->mt.slots[slot].seat_slot = seat_slot;
> > > > +		seat->slot_map |= 1 << seat_slot;
> > > > +
> > > >  		touch_notify_touch(base,
> > > >  				   time,
> > > > -				   slot,
> > > > +				   seat_slot,
> > > >  				   li_fixed_from_int(device->mt.slots[slot].x),
> > > >  				   li_fixed_from_int(device->mt.slots[slot].y),
> > > >  				   LIBINPUT_TOUCH_TYPE_DOWN);
> > > > @@ -139,6 +145,8 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
> > > >  		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
> > > >  			break;
> > > >  
> > > > +		seat_slot = device->mt.slots[slot].seat_slot;
> > > > +
> > > >  		touch_notify_touch(base,
> > > >  				   time,
> > > >  				   slot,
> > > > @@ -150,9 +158,12 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
> > > >  		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
> > > >  			break;
> > > >  
> > > > +		seat_slot = device->mt.slots[slot].seat_slot;
> > > > +		seat->slot_map &= ~(1 << seat_slot);
> > > > +
> > > >  		touch_notify_touch(base,
> > > >  				   time,
> > > > -				   slot,
> > > > +				   seat_slot,
> > > >  				   0, 0,
> > > >  				   LIBINPUT_TOUCH_TYPE_UP);
> > > >  		break;
> > > > @@ -160,6 +171,10 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
> > > >  		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
> > > >  			break;
> > > >  
> > > > +		seat_slot = ffs(~seat->slot_map) - 1;
> > > > +		device->abs.seat_slot = seat_slot;
> > > > +		seat->slot_map |= 1 << seat_slot;
> > > > +
> > > >  		transform_absolute(device, &cx, &cy);
> > > >  		touch_notify_touch(base,
> > > >  				   time,
> > > > @@ -173,7 +188,7 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
> > > >  		if (device->seat_caps & EVDEV_DEVICE_TOUCH) {
> > > >  			touch_notify_touch(base,
> > > >  					   time,
> > > > -					   slot,
> > > > +					   device->abs.seat_slot,
> > > >  					   li_fixed_from_int(cx),
> > > >  					   li_fixed_from_int(cy),
> > > >  					   LIBINPUT_TOUCH_TYPE_DOWN);
> > > > @@ -188,6 +203,9 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
> > > >  		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
> > > >  			break;
> > > >  
> > > > +		seat_slot = device->abs.seat_slot;
> > > > +		seat->slot_map &= ~(1 << seat_slot);
> > > > +
> > > >  		touch_notify_touch(base,
> > > >  				   time,
> > > >  				   0, 0, 0, LIBINPUT_TOUCH_TYPE_UP);
> > > > diff --git a/src/evdev.h b/src/evdev.h
> > > > index 37c32e5..b0feb28 100644
> > > > --- a/src/evdev.h
> > > > +++ b/src/evdev.h
> > > > @@ -64,6 +64,8 @@ struct evdev_device {
> > > >  		int min_x, max_x, min_y, max_y;
> > > >  		int32_t x, y;
> > > >  
> > > > +		uint32_t seat_slot;
> > > > +
> > > >  		int apply_calibration;
> > > >  		float calibration[6];
> > > >  	} abs;
> > > > @@ -71,6 +73,7 @@ struct evdev_device {
> > > >  	struct {
> > > >  		int slot;
> > > >  		struct {
> > > > +			uint32_t seat_slot;
> > > >  			int32_t x, y;
> > > >  		} slots[MAX_SLOTS];
> > > >  	} mt;
> > > > diff --git a/src/libinput-private.h b/src/libinput-private.h
> > > > index 0d7de90..2eea012 100644
> > > > --- a/src/libinput-private.h
> > > > +++ b/src/libinput-private.h
> > > > @@ -57,6 +57,7 @@ struct libinput_seat {
> > > >  	struct list devices_list;
> > > >  	void *user_data;
> > > >  	int refcount;
> > > > +	uint32_t slot_map;
> > > >  	char *physical_name;
> > > >  	char *logical_name;
> > > >  	libinput_seat_destroy_func destroy;
> > > > diff --git a/src/libinput.h b/src/libinput.h
> > > > index e2d83bf..9cd9d5b 100644
> > > > --- a/src/libinput.h
> > > > +++ b/src/libinput.h
> > > > @@ -568,8 +568,8 @@ libinput_event_touch_get_time(
> > > >  /**
> > > >   * @ingroup event_touch
> > > >   *
> > > > - * Get the currently active slot on this device. See the kernel's multitouch
> > > > - * protocol B documentation for more information.
> > > > + * Get the slot of the touch event. A slot is a seat wide unique identifyer
> > > > + * of a touch point.
> > > >   *
> > > >   * @note this function should not be called for LIBINPUT_EVENT_TOUCH_FRAME.
> > > >   *
> > > > -- 
> > > > 1.8.3.2
> > > > 
> > > > _______________________________________________
> > > > 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