From: Chris Bagwell <ch...@cnpbagwell.com>

BTN_TOOL_FINGER/DOUBLETAP/TRIPLETAP have incompatible meanings
between generic and protocol 4/5 devices.  Add logic to give
rough value of wcmProtocolLevel when probing wcmKeys (can't
tell difference between 4 and 5 which is OK at this level).

Use this rough value to generic set 1FGT and 2FGT features.

Any new MT touchpad using ABS_MT_SLOT will now work without
modification to xf86-input-wacom.

Any new protocol 4 touchpad using TRIPLETAP or DOUBLETAP will
also now work without modification to xf86-input-wacom.

Touchscreens will work in relative mode because currently only
tablet_id informs this.  Generic protocols may eventually have
something in kernel that can be queried for touchscreen vs.
touchpad.

Signed-off-by: Chris Bagwell <ch...@cnpbagwell.com>
---
 src/wcmISDV4.c          |    3 +++
 src/wcmUSB.c            |   16 ++++++++++++++++
 src/wcmValidateDevice.c |   31 +++++++++++++++++++------------
 3 files changed, 38 insertions(+), 12 deletions(-)

diff --git a/src/wcmISDV4.c b/src/wcmISDV4.c
index 2c3ca9a..6c50dfb 100644
--- a/src/wcmISDV4.c
+++ b/src/wcmISDV4.c
@@ -942,6 +942,9 @@ static int isdv4ProbeKeys(InputInfoPtr pInfo)
        SETBIT(common->wcmKeys, BTN_TOOL_PEN);
        SETBIT(common->wcmKeys, BTN_TOOL_RUBBER);
 
+       /* wcmKeys are based on Protocol 4 meanings */
+       common->wcmProtocolLevel = WCM_PROTOCOL_4;
+
        if (model->set_bits)
                tablet_id = model->set_bits(id, common->wcmKeys);
 
diff --git a/src/wcmUSB.c b/src/wcmUSB.c
index c25e67c..9341ee4 100644
--- a/src/wcmUSB.c
+++ b/src/wcmUSB.c
@@ -1358,12 +1358,15 @@ static void usbDispatchEvents(InputInfoPtr pInfo)
  * Query the device's fd for the key bits and the tablet ID. Returns the ID
  * on success or 0 on failure.
  * For USB devices, we simply copy the information the kernel gives us.
+ * Since keys have different meanings between protocol 4/5 and generic,
+ * assign that a rough value here.
  */
 static int usbProbeKeys(InputInfoPtr pInfo)
 {
        struct input_id wacom_id;
        WacomDevicePtr  priv = (WacomDevicePtr)pInfo->private;
        WacomCommonPtr  common = priv->common;
+       unsigned long abs[NBITS(ABS_MAX)] = {0};
 
        if (ioctl(pInfo->fd, EVIOCGBIT(EV_KEY, (sizeof(unsigned long)
                                                * NBITS(KEY_MAX))), 
common->wcmKeys) < 0)
@@ -1380,6 +1383,19 @@ static int usbProbeKeys(InputInfoPtr pInfo)
                return 0;
        }
 
+        if (ioctl(pInfo->fd, EVIOCGBIT(EV_ABS, sizeof(abs)), abs) < 0)
+       {
+               xf86Msg(X_ERROR, "%s: usbProbeKeys unable to ioctl "
+                       "abs bits.\n", pInfo->name);
+               return 0;
+       }
+
+       /* A generic protocol device does not report ABS_MISC event */
+       if (ISBITSET(abs, ABS_MISC))
+               common->wcmProtocolLevel = WCM_PROTOCOL_4;
+       else
+               common->wcmProtocolLevel = WCM_PROTOCOL_GENERIC;
+
        return wacom_id.product;
 }
 
diff --git a/src/wcmValidateDevice.c b/src/wcmValidateDevice.c
index b7312a3..9e0cca3 100644
--- a/src/wcmValidateDevice.c
+++ b/src/wcmValidateDevice.c
@@ -256,28 +256,16 @@ int wcmDeviceTypeKeys(InputInfoPtr pInfo)
                case 0xE3: /* TPC with 2FGT */
                        priv->common->tablet_type = WCM_TPC;
                        priv->common->tablet_type |= WCM_LCD;
-                       /* fall through */
-               case 0xD0:  /* Bamboo with 2FGT */
-               case 0xD1:  /* Bamboo with 2FGT */
-               case 0xD2:  /* Bamboo with 2FGT */
-               case 0xD3:  /* Bamboo with 2FGT */
-               case 0xD8:  /* Bamboo with 2FGT */
-               case 0xDA:  /* Bamboo with 2FGT */
-               case 0xDB:  /* Bamboo with 2FGT */
-                       priv->common->tablet_type |= WCM_2FGT;
                        break;
 
                case 0x93: /* TPC with 1FGT */
                case 0x9A: /* TPC with 1FGT */
-                       priv->common->tablet_type = WCM_1FGT;
-                       /* fall through */
                case 0x90: /* TPC */
                        priv->common->tablet_type |= WCM_TPC;
                        priv->common->tablet_type |= WCM_LCD;
                        break;
 
                case 0x9F:
-                       priv->common->tablet_type = WCM_1FGT;
                        priv->common->tablet_type |= WCM_LCD;
                        break;
 
@@ -291,6 +279,25 @@ int wcmDeviceTypeKeys(InputInfoPtr pInfo)
                priv->common->tablet_type |= WCM_PAD;
        }
 
+       /* Protocol 4 TRIPLETAP means 2 finger touch. */
+       if (common->wcmProtocolLevel == WCM_PROTOCOL_4 &&
+           ISBITSET(common->wcmKeys, BTN_TOOL_TRIPLETAP))
+       {
+               priv->common->tablet_type |= WCM_2FGT;
+       }
+       /* Protocol 4 DOUBLETAP without TRIPLETAP means 1 finger touch */
+       else if (common->wcmProtocolLevel == WCM_PROTOCOL_4 &&
+                ISBITSET(common->wcmKeys, BTN_TOOL_DOUBLETAP))
+       {
+               priv->common->tablet_type |= WCM_1FGT;
+       }
+
+       if (common->wcmProtocolLevel == WCM_PROTOCOL_GENERIC)
+       {
+               if (ISBITSET(common->wcmKeys, BTN_TOOL_DOUBLETAP))
+                       priv->common->tablet_type |= WCM_2FGT;
+       }
+
        return ret;
 }
 
-- 
1.7.3.3


------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and, 
should the need arise, upgrade to a full multi-node Oracle RAC database 
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to