On Mon, Jan 24, 2011 at 03:07:19PM -0800, Ping Cheng wrote:
> Resolution uses different units in the kernel (point/mm), XInput
> (point/m), and the hardware protocol (point/cm/1000 for touch and
> point/inch for pen).
> 
> We have a resolution table for pen in the X driver. But we get the
> touch resolution directly from the kernel through HID descriptor.
> 
> For kernels older than 2.6.30, resolution is not part of absinfo.
> For kernels older than 2.6.35, kernel does not pass resolution to
> the userland.
> 
> This patch addresses those issues and correct a conversion bug
> introduced by the RX/RY workaround.
> 
> Signed-off-by: Ping Cheng <pingli...@gmail.com>
> Reviewed-by: Chris Bagwell <ch...@cnpbagwell.com>
> ---
>  src/wcmUSB.c |   49 +++++++++++++++++++++++++++++++++++--------------
>  1 files changed, 35 insertions(+), 14 deletions(-)
> 
> diff --git a/src/wcmUSB.c b/src/wcmUSB.c
> index cfaf920..38a191b 100644
> --- a/src/wcmUSB.c
> +++ b/src/wcmUSB.c
> @@ -27,6 +27,9 @@
>  #include <asm/types.h>
>  #include <linux/input.h>
>  #include <sys/utsname.h>
> +# ifndef LINUX_VERSION_CODE

why not just include linux/version.h unconditionally?

> +# include <linux/version.h>
> +# endif
>  
>  #define MAX_USB_EVENTS 32
>  
> @@ -463,8 +466,19 @@ int usbWcmGetRanges(InputInfoPtr pInfo)
>       if (!is_touch)
>               common->wcmMaxX = absinfo.maximum;
>       else
> +     {
>               common->wcmMaxTouchX = absinfo.maximum;
>  
> +             /* reset touch resolution since we retrieve it from the kernel 
> +              * through absinfo (on kenrels 2.6.35 or later) or 
> +              * RX (on kenrels older than 2.6.35) below
> +              */
> +             common->wcmTouchResolX = 0;

this should be unnecessary. wcmAllocate uses calloc.

> +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30)
> +             common->wcmTouchResolX = absinfo.resolution * 1000;
> +#endif
> +     }
> +
>       /* max y */
>       if (ioctl(pInfo->fd, EVIOCGABS(ABS_Y), &absinfo) < 0)
>       {
> @@ -480,36 +494,43 @@ int usbWcmGetRanges(InputInfoPtr pInfo)
>       if (!is_touch)
>               common->wcmMaxY = absinfo.maximum;
>       else
> +     {
>               common->wcmMaxTouchY = absinfo.maximum;
>  
> +             /* reset touch resolution since we retrieve it from the kernel 
> +              * through absinfo (on kenrels 2.6.35 or later) or 
> +              * RY (on kenrels older than 2.6.35) below
> +              */
> +             common->wcmTouchResolY = 0;
> +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30)
> +             common->wcmTouchResolY = absinfo.resolution * 1000;
> +#endif
> +     }
> +
>       /* max finger strip X for tablets with Expresskeys
> -      * or touch physical X for TabletPCs with touch */
> +      * or physical X for touch device in thousandth of a cm */

wcmTouchResolY in the header file claims points/mm. this seems at odds with
this comment here.


>       if (ioctl(pInfo->fd, EVIOCGABS(ABS_RX), &absinfo) == 0)
>       {
> -             if (is_touch)
> -                     common->wcmTouchResolX = absinfo.maximum;
> +             if (is_touch && !common->wcmTouchResolX)

no. please add the same ifdef here so it's obvious why instead of the
non-obvious !common->wcmTouchResolX.

Cheers,
  Peter

> +                     common->wcmTouchResolX =
> +                             (int)(((double)common->wcmMaxTouchX * 10.0
> +                              / (double)absinfo.maximum) + 0.5);
>               else
>                       common->wcmMaxStripX = absinfo.maximum;
>       }
>  
>       /* max finger strip Y for tablets with Expresskeys
> -      * or touch physical Y for TabletPCs with touch */
> +      * or physical Y for touch device in thousandth of a cm */
>       if (ioctl(pInfo->fd, EVIOCGABS(ABS_RY), &absinfo) == 0)
>       {
> -             if (is_touch)
> -                     common->wcmTouchResolY = absinfo.maximum;
> +             if (is_touch && !common->wcmTouchResolY)
> +                     common->wcmTouchResolY =
> +                              (int)(((double)common->wcmMaxTouchY * 10.0
> +                              / (double)absinfo.maximum) + 0.5);
>               else
>                       common->wcmMaxStripY = absinfo.maximum;
>       }
>  
> -     if (is_touch && common->wcmTouchResolX && common->wcmMaxTouchX)
> -     {
> -             common->wcmTouchResolX = (int)(((double)common->wcmTouchResolX)
> -                      / ((double)common->wcmMaxTouchX) + 0.5);
> -             common->wcmTouchResolY = (int)(((double)common->wcmTouchResolY)
> -                      / ((double)common->wcmMaxTouchY) + 0.5);
> -     }
> -
>       /* max z cannot be configured */
>       if (ioctl(pInfo->fd, EVIOCGABS(ABS_PRESSURE), &absinfo) == 0)
>               common->wcmMaxZ = absinfo.maximum;
> -- 
> 1.7.3.4
 
 

------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires 
February 28th, so secure your free ArcSight Logger TODAY! 
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to