On Sat, Aug 27, 2011 at 12:03:19PM -0500, ch...@cnpbagwell.com wrote:
> From: Chris Bagwell <ch...@cnpbagwell.com>
> 
> Signed-off-by: Chris Bagwell <ch...@cnpbagwell.com>
> ---
> 
> This patch is added to my github gesture3 branch but probably applys
> fine to master as well.
> 
> Current 2 finger gesture logic is geared towards resolution of old Bamboo
> linuxwacom driver.  It doesn't work well with Linux kernel Bamboo driver
> (it scales up resolution) or various touchscreens of random resolution.
> 
>  src/wcmCommon.c      |    9 +++++----
>  src/wcmTouchFilter.c |   36 ++++++++++++++++++++++++++----------
>  src/xf86Wacom.c      |    1 +
>  src/xf86Wacom.h      |    2 ++
>  src/xf86WacomDefs.h  |    1 +
>  5 files changed, 35 insertions(+), 14 deletions(-)
> 
> diff --git a/src/wcmCommon.c b/src/wcmCommon.c
> index e4ff7d9..1d38196 100644
> --- a/src/wcmCommon.c
> +++ b/src/wcmCommon.c
> @@ -1393,11 +1393,12 @@ WacomCommonPtr wcmNewCommon(void)
>       common->wcmFlags = 0;               /* various flags */
>       common->wcmProtocolLevel = WCM_PROTOCOL_4; /* protocol level */
>       common->wcmTPCButton = 0;          /* set Tablet PC button on/off */
> -     common->wcmGestureParameters.wcmZoomDistance = 50;
> -     common->wcmGestureParameters.wcmZoomDistanceDefault = 50;
> +     common->wcmGestureParameters.wcmZoomDistance = -1;
> +     common->wcmGestureParameters.wcmZoomDistanceDefault = -1;

git grep shows that wcmZoomDistanceDefault isn't used anywhere anymore. Best
to remove it in that case. same with wcmScrollDistanceDefault.

>       common->wcmGestureParameters.wcmScrollDirection = 0;
> -     common->wcmGestureParameters.wcmScrollDistance = 20;
> -     common->wcmGestureParameters.wcmScrollDistanceDefault = 20;
> +     common->wcmGestureParameters.wcmScrollDistance = -1;
> +     common->wcmGestureParameters.wcmScrollDistanceDefault = -1;
> +     common->wcmGestureParameters.wcmInlineDistance = -1;
>       common->wcmGestureParameters.wcmTapTime = 250;
>       common->wcmGestureParameters.wcmTapTimeDefault = 250;
>       common->wcmRotate = ROTATE_NONE;   /* default tablet rotation to off */
> diff --git a/src/wcmTouchFilter.c b/src/wcmTouchFilter.c
> index 1600705..0e1e258 100644
> --- a/src/wcmTouchFilter.c
> +++ b/src/wcmTouchFilter.c
> @@ -24,7 +24,6 @@
>  #include <math.h>
>  
>  /* Defines for 2FC Gesture */
> -#define WACOM_INLINE_DISTANCE        40
>  #define WACOM_HORIZ_ALLOWED           1
>  #define WACOM_VERT_ALLOWED            2
>  #define WACOM_GESTURE_LAG_TIME       10
> @@ -43,6 +42,20 @@
>  static void wcmFingerScroll(WacomDevicePtr priv);
>  static void wcmFingerZoom(WacomDevicePtr priv);
>  
> +void wcmInitGestureSizes(InputInfoPtr pInfo)
> +{
> +     WacomDevicePtr priv = (WacomDevicePtr) pInfo->private;
> +     WacomCommonPtr common = priv->common;
> +     WacomGesturesParameters *gp = &common->wcmGestureParameters;
> +
> +     if (gp->wcmZoomDistance == -1)
> +             gp->wcmZoomDistance = priv->maxX * (1600.0 / 14720);
> +     if (gp->wcmScrollDistance == -1)
> +             gp->wcmScrollDistance = priv->maxX * (640.0 / 14720);
> +     if (gp->wcmInlineDistance == -1)
> +             gp->wcmInlineDistance = priv->maxX * (1280.0 / 14720);

where do these numbers come from again?
shouldn't they have defines?

> +}
> +
>  static double touchDistance(WacomDeviceState ds0, WacomDeviceState ds1)
>  {
>       int xDelta = ds0.x - ds1.x;
> @@ -61,17 +74,18 @@ static Bool pointsInLine(WacomCommonPtr common, 
> WacomDeviceState ds0,
>                       WACOM_HORIZ_ALLOWED : WACOM_VERT_ALLOWED;
>       int vertical_rotated = (rotated) ?
>                       WACOM_VERT_ALLOWED : WACOM_HORIZ_ALLOWED;
> +     int inline_distance = common->wcmGestureParameters.wcmInlineDistance;
>  
>       if (!common->wcmGestureParameters.wcmScrollDirection)
>       {
> -             if ((abs(ds0.x - ds1.x) < WACOM_INLINE_DISTANCE) &&
> -                     (abs(ds0.y - ds1.y) > WACOM_INLINE_DISTANCE))
> +             if ((abs(ds0.x - ds1.x) < inline_distance) &&
> +                     (abs(ds0.y - ds1.y) > inline_distance))
>               {
>                       common->wcmGestureParameters.wcmScrollDirection = 
> horizon_rotated;
>                       ret = TRUE;
>               }
> -             if ((abs(ds0.y - ds1.y) < WACOM_INLINE_DISTANCE) &&
> -                     (abs(ds0.x - ds1.x) > WACOM_INLINE_DISTANCE))
> +             if ((abs(ds0.y - ds1.y) < inline_distance) &&
> +                     (abs(ds0.x - ds1.x) > inline_distance))
>               {
>                       common->wcmGestureParameters.wcmScrollDirection = 
> vertical_rotated;
>                       ret = TRUE;
> @@ -79,12 +93,12 @@ static Bool pointsInLine(WacomCommonPtr common, 
> WacomDeviceState ds0,
>       }
>       else if (common->wcmGestureParameters.wcmScrollDirection == 
> vertical_rotated)
>       {
> -             if (abs(ds0.y - ds1.y) < WACOM_INLINE_DISTANCE)
> +             if (abs(ds0.y - ds1.y) < inline_distance)
>                       ret = TRUE;
>       }
>       else if (common->wcmGestureParameters.wcmScrollDirection == 
> horizon_rotated)
>       {
> -             if (abs(ds0.x - ds1.x) < WACOM_INLINE_DISTANCE)
> +             if (abs(ds0.x - ds1.x) < inline_distance)
>                       ret = TRUE;
>       }
>       return ret;
> @@ -414,6 +428,7 @@ static void wcmFingerScroll(WacomDevicePtr priv)
>       int midPoint_old = 0;
>       int i = 0, dist = 0;
>       WacomFilterState filterd;  /* borrow this struct */
> +     int inline_distance = common->wcmGestureParameters.wcmInlineDistance;
>  
>       DBG(10, priv, "\n");
>  
> @@ -421,7 +436,7 @@ static void wcmFingerScroll(WacomDevicePtr priv)
>       {
>               if (abs(touchDistance(ds[0], ds[1]) -
>                       touchDistance(common->wcmGestureState[0],
> -                     common->wcmGestureState[1])) < WACOM_INLINE_DISTANCE)
> +                     common->wcmGestureState[1])) < inline_distance)
>               {
>                       /* two fingers stay close to each other all the time and
>                        * move in vertical or horizontal direction together
> @@ -511,6 +526,7 @@ static void wcmFingerZoom(WacomDevicePtr priv)
>       int count, button;
>       int dist = touchDistance(common->wcmGestureState[0],
>                       common->wcmGestureState[1]);
> +     int inline_distance = common->wcmGestureParameters.wcmInlineDistance;
>  
>       DBG(10, priv, "\n");
>  
> @@ -520,13 +536,13 @@ static void wcmFingerZoom(WacomDevicePtr priv)
>               if (abs(touchDistance(ds[0], ds[1]) -
>                       touchDistance(common->wcmGestureState[0],
>                                     common->wcmGestureState[1])) >
> -                     (3 * WACOM_INLINE_DISTANCE))
> +                     (3 * inline_distance))
>               {
>                       /* left button might be down, send it up first */
>                       wcmSendButtonClick(priv, 1, 0);
>  
>                       /* fingers moved apart more than 3 times
> -                      * WACOM_INLINE_DISTANCE, zoom mode is entered */
> +                      * wcmInlineDistance, zoom mode is entered */
>                       common->wcmGestureMode = GESTURE_ZOOM_MODE;
>               }
>       }
> diff --git a/src/xf86Wacom.c b/src/xf86Wacom.c
> index 16561b5..62738a6 100644
> --- a/src/xf86Wacom.c
> +++ b/src/xf86Wacom.c
> @@ -436,6 +436,7 @@ static int wcmDevInit(DeviceIntPtr pWcm)
>       {
>               wcmInitialToolSize(pInfo);
>               wcmMappingFactor(pInfo);
> +             wcmInitGestureSizes(pInfo);
>       }
>  
>       if (!wcmInitAxes(pWcm))
> diff --git a/src/xf86Wacom.h b/src/xf86Wacom.h
> index 60353dc..72d06bb 100644
> --- a/src/xf86Wacom.h
> +++ b/src/xf86Wacom.h
> @@ -128,6 +128,8 @@ Bool wcmAreaListOverlap(WacomToolAreaPtr area, 
> WacomToolAreaPtr list);
>  
>  /* calculate the proper tablet to screen mapping factor */
>  void wcmMappingFactor(InputInfoPtr pInfo);
> +/* calculate gesture sizes based on tablet sizes */
> +void wcmInitGestureSizes(InputInfoPtr pInfo);
>  
>  /* validation */
>  extern Bool wcmIsAValidType(InputInfoPtr pInfo, const char* type);
> diff --git a/src/xf86WacomDefs.h b/src/xf86WacomDefs.h
> index 94eee2e..65b7088 100644
> --- a/src/xf86WacomDefs.h
> +++ b/src/xf86WacomDefs.h
> @@ -414,6 +414,7 @@ typedef struct {
>       int wcmZoomDistanceDefault;    /* default minimum distance for a zoom 
> touch gesture */
>       int wcmScrollDistance;         /* minimum motion before sending a 
> scroll gesture */
>       int wcmScrollDirection;        /* store the vertical or horizontal bit 
> in use */
> +     int wcmInlineDistance;         /* maximum distance between fingers for 
> scroll gesture */

this should probably be named something like maxScrollDistance to be more 
explanatory.

Cheers,
  Peter

>       int wcmScrollDistanceDefault;  /* default minimum motion before sending 
> a scroll gesture */
>       int wcmGestureUsed;            /* retain used gesture count within one 
> in-prox event */
>       int wcmTapTime;                /* minimum time between taps for a right 
> click */
> -- 
> 1.7.6
 

------------------------------------------------------------------------------
Special Offer -- Download ArcSight Logger for FREE!
Finally, a world-class log management solution at an even better 
price-free! And you'll get a free "Love Thy Logs" t-shirt when you
download Logger. Secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsisghtdev2dev
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to