From: Egbert Eich <e...@suse.com>

This is the last bit of clean up and consolidation in tool type detection:
usbParseAbsEvent() sets the tool type if it recognized a button or key
event and the tool type has not been set before.
Before we get to usbParseAbsEvent() channel mapping must have failed most
certainly so we must have gotten a new channel for each button or key
sequence.
Since this seems to be a last resort attempt to determine the tool type
we only do this when all other methods have failed before. The newly
introduced function deriveDeviceTypeFromButtonEvent() mimics the behavior
of usbParseAbsEvent().

Signed-off-by: Egbert Eich <e...@suse.com>
---
 src/wcmUSB.c | 62 ++++++++++++++++++++++++++++++++----------------------------
 1 file changed, 33 insertions(+), 29 deletions(-)

diff --git a/src/wcmUSB.c b/src/wcmUSB.c
index 1cbfa80..8e64f61 100644
--- a/src/wcmUSB.c
+++ b/src/wcmUSB.c
@@ -1112,28 +1112,6 @@ static int usbFindDeviceTypeById(int device_id)
        return 0;
 }
 
-/**
- * Find the tool type (STYLUS_ID, etc.) based on the device_id or the
- *  current tool serial number if the device_id is unknown (0).
- *
- * Protocol 5 devices report different IDs for different styli and pucks,
- * Protocol 4 devices simply report STYLUS_DEVICE_ID, etc.
- *
- * @param ds The current device state received from the kernel.
- * @return The tool type associated with the tool id or the current
- * tool serial number.
- */
-static int usbFindDeviceType(const WacomCommonPtr common,
-                         const WacomDeviceState *ds)
-{
-       int device_type = 0;
-
-       if (!ds->device_id) return 0;
-
-       device_type = usbFindDeviceTypeById(ds->device_id);
-       return device_type;
-}
-
 static void usbParseAbsEvent(WacomCommonPtr common,
                            struct input_event *event, int channel_number)
 {
@@ -1189,10 +1167,7 @@ static void usbParseAbsEvent(WacomCommonPtr common,
                case ABS_MISC:
                        ds->proximity = (event->value != 0);
                        if (event->value)
-                       {
                                ds->device_id = event->value;
-                               ds->device_type = usbFindDeviceType(common, ds);
-                       }
                        break;
                default:
                        change = 0;
@@ -1467,10 +1442,6 @@ static void usbParseBTNEvent(WacomCommonPtr common,
        }
 
        channel->dirty |= change;
-
-       /* expresskey pressed at startup or missing type */
-       if (!ds->device_type && channel->dirty)
-               ds->device_type = PAD_ID;
 }
 
 /**
@@ -1568,6 +1539,35 @@ static int refreshDeviceType(WacomCommonPtr common)
        return 0;
 }
 
+static int deriveDeviceTypeFromButtonEvent(WacomCommonPtr common,
+                                          const struct input_event *event_ptr)
+{
+       wcmUSBData *usbdata = common->private;
+       int nkeys;
+
+       if (event_ptr->type == EV_KEY) {
+
+               switch (event_ptr->code) {
+               case BTN_LEFT:
+               case BTN_MIDDLE:
+               case BTN_RIGHT:
+               case BTN_SIDE:
+               case BTN_BACK:
+               case BTN_EXTRA:
+               case BTN_FORWARD:
+                       return PAD_ID;
+               default:
+                       for (nkeys = 0; nkeys < usbdata->npadkeys; nkeys++)
+                       {
+                               if (event_ptr->code == 
usbdata->padkey_code[nkeys]) {
+                                       return PAD_ID;
+                               }
+                       }
+               }
+       }
+       return 0;
+}
+
 /***
  * Retrieve the tool type from an USB data packet by looking at the event
  * codes. Refer to linux/input.h for event codes that define tool types.
@@ -1599,6 +1599,10 @@ static int usbInitToolType(WacomCommonPtr common, const 
struct input_event *even
        if (!device_type)
                device_type = refreshDeviceType(common);
 
+       if (!device_type) /* expresskey pressed at startup or missing type */
+               for (i = 0; (i < nevents) && !device_type; ++i, event_ptr++)
+                       device_type = deriveDeviceTypeFromButtonEvent(common, 
event_ptr);
+
        return device_type;
 }
 
-- 
1.8.4.5


------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/13534_NeoTech
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to