[PATCH libinput] Add libinput_device_touch_get_touch_count()

Peter Hutterer peter.hutterer at who-t.net
Mon Apr 30 23:54:11 UTC 2018


On Fri, Apr 20, 2018 at 01:03:45PM +0200, Johannes Pointner wrote:
> Hello Peter,
> 
> I'm really sorry. I somehow completely missed your email.
> 
> I have now tested your patch with the 1.10-branch of libinput and
> xf86-input-libinput-0.27.1 (the current versions used on my Arch Linux
> PC).
> Therefore I patched xf86-input-libinput.c like that:
> diff --git a/src/xf86libinput.c b/src/xf86libinput.c
> index f9ed8ba..dfbde9f 100644
> --- a/src/xf86libinput.c
> +++ b/src/xf86libinput.c
> @@ -1058,11 +1058,13 @@ xf86libinput_init_touch(InputInfoPtr pInfo)
>  {
>   DeviceIntPtr dev = pInfo->dev;
>   struct xf86libinput *driver_data = pInfo->private;
> + struct libinput_device *device = driver_data->shared_device->device;
>   int min, max, res;
>   unsigned char btnmap[MAX_BUTTONS + 1];
>   Atom btnlabels[MAX_BUTTONS];
>   Atom axislabels[TOUCHPAD_NUM_AXES];
>   int nbuttons = 7;
> + int ntouches;
> 
>   init_button_map(btnmap, ARRAY_SIZE(btnmap));
>   init_button_labels(btnlabels, ARRAY_SIZE(btnlabels));
> @@ -1086,7 +1088,8 @@ xf86libinput_init_touch(InputInfoPtr pInfo)
>   xf86InitValuatorAxisStruct(dev, 1,
>              XIGetKnownProperty(AXIS_LABEL_PROP_ABS_MT_POSITION_Y),
>      min, max, res * 1000, 0, res * 1000, Absolute);
> - InitTouchClassDeviceStruct(dev, TOUCH_MAX_SLOTS, XIDirectTouch, 2);
> + ntouches = libinput_device_touch_get_touch_count(device);
> + InitTouchClassDeviceStruct(dev, ntouches, XIDirectTouch, 2);
> 
> As a result I was able to get the actual number of touch points from
> Chromium through
> https://developer.mozilla.org/en-US/docs/Web/API/Navigator/maxTouchPoints.

thanks. I've pushed the libinput patch now as commit
63e5372190606c5c124eafbc4cac753f59bb9f69. Will get to the xf86-... patch
shortly.

Cheers,
   Peter

> 
> Cheers,
> Hannes
> 
> On Mon, Mar 19, 2018 at 5:41 AM, Peter Hutterer
> <peter.hutterer at who-t.net> wrote:
> > On Fri, Mar 02, 2018 at 06:16:34PM +1000, Peter Hutterer wrote:
> >> This makes it possible for callers to detect whether a touch device is
> >> single or multitouch (or even check for things like dual-touch vs real
> >> multi-touch) and adjust the interface accordingly.
> >>
> >> Note that this is for touch devices only, not touchpads that are just pointer
> >> devices.
> >
> > ping? as a general rule, I don't add new APIs unless the people who need it
> > review the patches...
> >
> > Cheers,
> >    Peter
> >
> >> https://bugs.freedesktop.org/show_bug.cgi?id=104867
> >>
> >> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> >> ---
> >>  src/evdev.c       | 22 ++++++++++++++++++++++
> >>  src/evdev.h       |  3 +++
> >>  src/libinput.c    |  6 ++++++
> >>  src/libinput.h    | 14 ++++++++++++++
> >>  src/libinput.sym  |  4 ++++
> >>  test/test-touch.c | 23 +++++++++++++++++++++++
> >>  6 files changed, 72 insertions(+)
> >>
> >> diff --git a/src/evdev.c b/src/evdev.c
> >> index 257824aa..629d4e2f 100644
> >> --- a/src/evdev.c
> >> +++ b/src/evdev.c
> >> @@ -2224,6 +2224,28 @@ evdev_device_has_key(struct evdev_device *device, uint32_t code)
> >>       return libevdev_has_event_code(device->evdev, EV_KEY, code);
> >>  }
> >>
> >> +int
> >> +evdev_device_get_touch_count(struct evdev_device *device)
> >> +{
> >> +     int ntouches;
> >> +
> >> +     if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
> >> +             return -1;
> >> +
> >> +     ntouches = libevdev_get_num_slots(device->evdev);
> >> +     if (ntouches == -1) {
> >> +             /* mtdev device have multitouch but we don't know
> >> +              * how many. Otherwise, any touch device with num_slots of
> >> +              * -1 is a single-touch device */
> >> +             if (device->mtdev)
> >> +                     ntouches = 0;
> >> +             else
> >> +                     ntouches = 1;
> >> +     }
> >> +
> >> +     return ntouches;
> >> +}
> >> +
> >>  int
> >>  evdev_device_has_switch(struct evdev_device *device,
> >>                       enum libinput_switch sw)
> >> diff --git a/src/evdev.h b/src/evdev.h
> >> index 162adecb..e732e693 100644
> >> --- a/src/evdev.h
> >> +++ b/src/evdev.h
> >> @@ -459,6 +459,9 @@ evdev_device_has_button(struct evdev_device *device, uint32_t code);
> >>  int
> >>  evdev_device_has_key(struct evdev_device *device, uint32_t code);
> >>
> >> +int
> >> +evdev_device_get_touch_count(struct evdev_device *device);
> >> +
> >>  int
> >>  evdev_device_has_switch(struct evdev_device *device,
> >>                       enum libinput_switch sw);
> >> diff --git a/src/libinput.c b/src/libinput.c
> >> index 8fb0ba92..5e675dd9 100644
> >> --- a/src/libinput.c
> >> +++ b/src/libinput.c
> >> @@ -2941,6 +2941,12 @@ libinput_device_keyboard_has_key(struct libinput_device *device, uint32_t code)
> >>       return evdev_device_has_key((struct evdev_device *)device, code);
> >>  }
> >>
> >> +LIBINPUT_EXPORT int
> >> +libinput_device_touch_get_touch_count(struct libinput_device *device)
> >> +{
> >> +     return evdev_device_get_touch_count((struct evdev_device *)device);
> >> +}
> >> +
> >>  LIBINPUT_EXPORT int
> >>  libinput_device_switch_has_switch(struct libinput_device *device,
> >>                                 enum libinput_switch sw)
> >> diff --git a/src/libinput.h b/src/libinput.h
> >> index 759bce91..d9f74d2f 100644
> >> --- a/src/libinput.h
> >> +++ b/src/libinput.h
> >> @@ -3713,6 +3713,20 @@ int
> >>  libinput_device_keyboard_has_key(struct libinput_device *device,
> >>                                uint32_t code);
> >>
> >> +/**
> >> + * @ingroup device
> >> + *
> >> + * Check how many touches a @ref LIBINPUT_DEVICE_CAP_TOUCH device supports
> >> + * simultaneously.
> >> + *
> >> + * @param device A current input device
> >> + *
> >> + * @return The number of simultaneous touches or 0 if unknown, -1
> >> + * on error.
> >> + */
> >> +int
> >> +libinput_device_touch_get_touch_count(struct libinput_device *device);
> >> +
> >>  /**
> >>   * @ingroup device
> >>   *
> >> diff --git a/src/libinput.sym b/src/libinput.sym
> >> index bb283407..aa2794e9 100644
> >> --- a/src/libinput.sym
> >> +++ b/src/libinput.sym
> >> @@ -293,3 +293,7 @@ LIBINPUT_1.7 {
> >>  LIBINPUT_1.9 {
> >>       libinput_device_switch_has_switch;
> >>  } LIBINPUT_1.7;
> >> +
> >> +LIBINPUT_1.11 {
> >> +     libinput_device_touch_get_touch_count;
> >> +} LIBINPUT_1.9;
> >> diff --git a/test/test-touch.c b/test/test-touch.c
> >> index b3a6d0a0..a14bcf4b 100644
> >> --- a/test/test-touch.c
> >> +++ b/test/test-touch.c
> >> @@ -945,6 +945,26 @@ START_TEST(touch_release_on_unplug)
> >>  }
> >>  END_TEST
> >>
> >> +START_TEST(touch_count_st)
> >> +{
> >> +     struct litest_device *dev = litest_current_device();
> >> +     struct libinput_device *device = dev->libinput_device;
> >> +
> >> +     ck_assert_int_eq(libinput_device_touch_get_touch_count(device), 1);
> >> +}
> >> +END_TEST
> >> +
> >> +START_TEST(touch_count_mt)
> >> +{
> >> +     struct litest_device *dev = litest_current_device();
> >> +     struct libinput_device *device = dev->libinput_device;
> >> +     struct libevdev *evdev = dev->evdev;
> >> +
> >> +     ck_assert_int_eq(libinput_device_touch_get_touch_count(device),
> >> +                      libevdev_get_num_slots(evdev));
> >> +}
> >> +END_TEST
> >> +
> >>  void
> >>  litest_setup_tests_touch(void)
> >>  {
> >> @@ -980,4 +1000,7 @@ litest_setup_tests_touch(void)
> >>       litest_add_for_device("touch:fuzz", touch_fuzz, LITEST_MULTITOUCH_FUZZ_SCREEN);
> >>
> >>       litest_add_no_device("touch:release", touch_release_on_unplug);
> >> +
> >> +     litest_add("touch:count", touch_count_st, LITEST_SINGLE_TOUCH, LITEST_TOUCHPAD);
> >> +     litest_add("touch:count", touch_count_mt, LITEST_TOUCH, LITEST_SINGLE_TOUCH);
> >>  }
> >> --
> >> 2.14.3


More information about the wayland-devel mailing list