On Wed, Aug 31, 2011 at 1:09 AM, Peter Hutterer
<peter.hutte...@who-t.net> wrote:
> 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.
>

Yep. Addressed.   Hmm, cool tool.  I'll have to play with that more.

>>       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?

Good question.  :-)  They come from the original wcm*Distance values
used in init function that was deleted but scaling them up with "<< 5"
to match how kernel driver is also scaling up reported values by "<<
5".  The maximum value of 14720 also comes from latest Bamboo reported
maximums.

I'm not sure they are ideal values yet but work reasonably well.

> shouldn't they have defines?

Dunno. Your call.  xf86-input-synaptics didn't do it for similar
values.  Original code in init didn't either.  So I didn't bother.

I can see some value in #define MAX_BAMBOO_X 14720 to let reader know
where that came from.  MAX synaptics X value is a little more defacto
value so not as confusing.

>
>> +}
>> +
>>  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.

Makes sense.  I'll update.  Maybe wcmMaxScrollWidth is even better?
Distance makes me think about fingers traveling.

>
> 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