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.hutte...@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.hutte...@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 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel