If there is an i2c HID device that has a Digitizers/Touchscreen 
collection and an X report, attach ims to it.  hidms already has 
support for touchscreens.

This may help if you have a newer laptop with a touchscreen.

Also limit the logical min/max finding in hidms to the first 
non-zero result.  The HID descriptor for these touchscreens have 
lots of complicated reports which may produce false positives.


Index: sys/dev/i2c/ims.c
===================================================================
RCS file: /cvs/src/sys/dev/i2c/ims.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 ims.c
--- sys/dev/i2c/ims.c   12 Jan 2016 01:11:15 -0000      1.1
+++ sys/dev/i2c/ims.c   31 Aug 2018 21:42:30 -0000
@@ -85,6 +85,12 @@ ims_match(struct device *parent, void *m
            HID_USAGE2(HUP_DIGITIZERS, HUD_PEN)))
                return (IMATCH_IFACECLASS);
 
+       if (hid_is_collection(desc, size, iha->reportid,
+           HID_USAGE2(HUP_DIGITIZERS, HUD_TOUCHSCREEN)) &&
+           hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_X),
+           iha->reportid, hid_input, NULL, NULL))
+               return (IMATCH_IFACECLASS);
+
        return (IMATCH_NONE);
 }
 
Index: sys/dev/hid/hidms.c
===================================================================
RCS file: /cvs/src/sys/dev/hid/hidms.c,v
retrieving revision 1.3
diff -u -p -u -p -r1.3 hidms.c
--- sys/dev/hid/hidms.c 22 May 2016 22:06:11 -0000      1.3
+++ sys/dev/hid/hidms.c 31 Aug 2018 21:42:30 -0000
@@ -241,13 +241,15 @@ hidms_setup(struct device *self, struct 
                        h.usage, h.logical_minimum, h.logical_maximum));
                switch (HID_GET_USAGE(h.usage)) {
                case HUG_X:
-                       if (ms->sc_flags & HIDMS_ABSX) {
+                       if (ms->sc_flags & HIDMS_ABSX &&
+                           !ms->sc_tsscale.minx && !ms->sc_tsscale.maxy) {
                                ms->sc_tsscale.minx = h.logical_minimum;
                                ms->sc_tsscale.maxx = h.logical_maximum;
                        }
                        break;
                case HUG_Y:
-                       if (ms->sc_flags & HIDMS_ABSY) {
+                       if (ms->sc_flags & HIDMS_ABSY &&
+                           !ms->sc_tsscale.miny && !ms->sc_tsscale.maxy) {
                                ms->sc_tsscale.miny = h.logical_minimum;
                                ms->sc_tsscale.maxy = h.logical_maximum;
                        }

Reply via email to