From: Chris Bagwell <ch...@cnpbagwell.com> For Bamboo P&T devices, both a touch and pad type are shared for single input device and can be called in any order based on xorg.conf. And normal HAL order is to invoke usbGetRanges() from pad first.
This meant all logic related to IsTouch() was not correctly running. Updated to treat pad type as touch in special case of Bamboo P&T. This is applies to devices that have both BTN_TOOL_FINGER and BTN_TOOL_DOUBLETAP which currently is limitted to Bamboo touch devices. Signed-off-by: Chris Bagwell <ch...@cnpbagwell> Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net> Reviewed-by: Ping Cheng <pingli...@gmail.com> --- src/wcmUSB.c | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/wcmUSB.c b/src/wcmUSB.c index ed53897..466ffae 100644 --- a/src/wcmUSB.c +++ b/src/wcmUSB.c @@ -613,6 +613,17 @@ int usbWcmGetRanges(LocalDevicePtr local) unsigned long abs[NBITS(ABS_MAX)] = {0}; WacomDevicePtr priv = (WacomDevicePtr)local->private; WacomCommonPtr common = priv->common; + int is_touch; + + is_touch = IsTouch(priv); + /* Bamboo P&T have both Touch and Pad types on same + * device. Its normal for this to be called for pad + * case and logic requires it to act same as Touch + * case. + */ + if (IsPad(priv) && + common->tablet_id >= 0xd0 && common->tablet_id <= 0xd3) + is_touch = 1; if (ioctl(local->fd, EVIOCGBIT(0 /*EV*/, sizeof(ev)), ev) < 0) { @@ -647,7 +658,7 @@ int usbWcmGetRanges(LocalDevicePtr local) xf86Msg(X_ERROR, "%s: xmax value is wrong.\n", local->name); return !Success; } - if (!IsTouch(priv)) + if (!is_touch) common->wcmMaxX = absinfo.maximum; else common->wcmMaxTouchX = absinfo.maximum; @@ -664,7 +675,7 @@ int usbWcmGetRanges(LocalDevicePtr local) xf86Msg(X_ERROR, "%s: ymax value is wrong.\n", local->name); return !Success; } - if (!IsTouch(priv)) + if (!is_touch) common->wcmMaxY = absinfo.maximum; else common->wcmMaxTouchY = absinfo.maximum; @@ -673,7 +684,7 @@ int usbWcmGetRanges(LocalDevicePtr local) * or touch physical X for TabletPCs with touch */ if (ioctl(local->fd, EVIOCGABS(ABS_RX), &absinfo) == 0) { - if (IsTouch(priv)) + if (is_touch) common->wcmTouchResolX = absinfo.maximum; else common->wcmMaxStripX = absinfo.maximum; @@ -683,13 +694,13 @@ int usbWcmGetRanges(LocalDevicePtr local) * or touch physical Y for TabletPCs with touch */ if (ioctl(local->fd, EVIOCGABS(ABS_RY), &absinfo) == 0) { - if (IsTouch(priv)) + if (is_touch) common->wcmTouchResolY = absinfo.maximum; else common->wcmMaxStripY = absinfo.maximum; } - if (IsTouch(priv) && common->wcmTouchResolX && common->wcmMaxTouchX) + if (is_touch && common->wcmTouchResolX && common->wcmMaxTouchX) { common->wcmTouchResolX = (int)(((double)common->wcmTouchResolX) / ((double)common->wcmMaxTouchX) + 0.5); -- 1.6.6.1 ------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ Linuxwacom-devel mailing list Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel