HID: ntrig: fix touch events
authorRafi Rubin <rafi@seas.upenn.edu>
Wed, 10 Mar 2010 15:10:28 +0000 (16:10 +0100)
committerJiri Kosina <jkosina@suse.cz>
Wed, 10 Mar 2010 15:10:28 +0000 (16:10 +0100)
This reinstates the lost unpressing of BTN_TOUCH.  To prevent undesireably
touch toggles this also deals with tip switch events.

Added a trap to prevent going out of bounds for hidinputs with empty reports.

Clear bits of unused buttons which result in misidentification.

Signed-off-by: Rafi Rubin <rafi@seas.upenn.edu>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-ntrig.c

index 3234c729a895f1cf733e59149c07eb5e83fac1b6..edcc0c4247bb6c62f99b2bcbd22d77c90ab05577 100644 (file)
@@ -140,6 +140,9 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field,
                        nd->reading_mt = 1;
                        nd->first_contact_confidence = 0;
                        break;
+               case HID_DG_TIPSWITCH:
+                       /* Prevent emission of touch until validated */
+                       return 1;
                case HID_DG_CONFIDENCE:
                        nd->confidence = value;
                        break;
@@ -259,6 +262,7 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field,
                                                BTN_TOOL_TRIPLETAP, 0);
                                input_report_key(input,
                                                BTN_TOOL_QUADTAP, 0);
+                               input_report_key(input, BTN_TOUCH, 0);
                        }
                        break;
 
@@ -308,13 +312,20 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id)
 
 
        list_for_each_entry(hidinput, &hdev->inputs, list) {
+               if (hidinput->report->maxfield < 1)
+                       continue;
+
                input = hidinput->input;
                switch (hidinput->report->field[0]->application) {
                case HID_DG_PEN:
                        input->name = "N-Trig Pen";
                        break;
                case HID_DG_TOUCHSCREEN:
+                       /* These keys are redundant for fingers, clear them
+                        * to prevent incorrect identification */
                        __clear_bit(BTN_TOOL_PEN, input->keybit);
+                       __clear_bit(BTN_TOOL_FINGER, input->keybit);
+                       __clear_bit(BTN_0, input->keybit);
                        /*
                         * A little something special to enable
                         * two and three finger taps.