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