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