From e8758c7e77c4d5e501b4bcaf0622a4f3c9824253 Mon Sep 17 00:00:00 2001 From: Simon Thum Date: Sun, 5 Sep 2010 18:10:42 +0200 Subject: [PATCH 2/4] dix: refactor predictable scheme initialization This intends to clean up the predictable accel struct from purely scheme-related things like input properties, as they would be useless in other use cases such as wheel acceleration. Signed-off-by: Simon Thum --- dix/ptrveloc.c | 75 ++++++++++++++++++++++++++++++++++----------------- include/ptrveloc.h | 13 ++++++--- 2 files changed, 59 insertions(+), 29 deletions(-) diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c index 1b9c81b..5416ef7 100644 --- a/dix/ptrveloc.c +++ b/dix/ptrveloc.c @@ -30,6 +30,7 @@ #include #include #include +#include #include @@ -68,9 +69,9 @@ SimpleSmoothProfile(DeviceIntPtr dev, DeviceVelocityPtr vel, float velocity, static PointerAccelerationProfileFunc GetAccelerationProfile(DeviceVelocityPtr vel, int profile_num); static BOOL -InitializePredictableAccelerationProperties(DeviceIntPtr dev); +InitializePredictableAccelerationProperties(DeviceIntPtr, long*); static BOOL -DeletePredictableAccelerationProperties(DeviceIntPtr dev); +DeletePredictableAccelerationProperties(DeviceIntPtr, long*); /*#define PTRACCEL_DEBUGGING*/ @@ -87,6 +88,9 @@ DeletePredictableAccelerationProperties(DeviceIntPtr dev); /* some int which is not a profile number */ #define PROFILE_UNINITIALIZE (-100) +/* number of properties for predictable acceleration */ +#define NPROPS_PREDICTABLE_ACCEL 4 + /** * Init DeviceVelocity struct so it should match the average case @@ -125,17 +129,24 @@ FreeVelocityData(DeviceVelocityPtr vel){ */ Bool InitPredictableAccelerationScheme(DeviceIntPtr dev, - ValuatorAccelerationPtr protoScheme) { + ValuatorAccelerationPtr protoScheme) { DeviceVelocityPtr vel; ValuatorAccelerationRec scheme; + PredictableAccelSchemePtr schemeData; scheme = *protoScheme; vel = calloc(1, sizeof(DeviceVelocityRec)); - if (!vel) - return FALSE; + schemeData = calloc(1, sizeof(PredictableAccelSchemeRec)); + if (!vel || !schemeData) + return FALSE; InitVelocityData(vel); - scheme.accelData = vel; + schemeData->vel = vel; + schemeData->prop_handlers = calloc(NPROPS_PREDICTABLE_ACCEL, + sizeof(long)); + if (!schemeData->prop_handlers) + return FALSE; + scheme.accelData = schemeData; dev->valuator->accelScheme = scheme; - InitializePredictableAccelerationProperties(dev); + InitializePredictableAccelerationProperties(dev, schemeData->prop_handlers); return TRUE; } @@ -146,14 +157,24 @@ InitPredictableAccelerationScheme(DeviceIntPtr dev, void AccelerationDefaultCleanup(DeviceIntPtr dev) { - /*sanity check*/ - if( dev->valuator->accelScheme.AccelSchemeProc == acceleratePointerPredictable - && dev->valuator->accelScheme.accelData != NULL){ + DeviceVelocityPtr vel = GetDevicePredictableAccelData(dev); + long* prop_handlers; + if (vel) { + /* the proper guarantee would be that we're not inside of + * AccelSchemeProc(), but that seems impossible. Schemes don't get + * schwitched often anyway. + */ + OsBlockSignals(); dev->valuator->accelScheme.AccelSchemeProc = NULL; - FreeVelocityData(dev->valuator->accelScheme.accelData); + FreeVelocityData(vel); + free(vel); + prop_handlers = ((PredictableAccelSchemePtr) + dev->valuator->accelScheme.accelData)->prop_handlers; + DeletePredictableAccelerationProperties(dev, prop_handlers); + free(prop_handlers); free(dev->valuator->accelScheme.accelData); dev->valuator->accelScheme.accelData = NULL; - DeletePredictableAccelerationProperties(dev); + OsReleaseSignals(); } } @@ -345,26 +366,30 @@ AccelInitScaleProperty(DeviceIntPtr dev, DeviceVelocityPtr vel) return XIRegisterPropertyHandler(dev, AccelSetScaleProperty, NULL, NULL); } -BOOL -InitializePredictableAccelerationProperties(DeviceIntPtr dev) +static BOOL +InitializePredictableAccelerationProperties( + DeviceIntPtr dev, + long* prop_handlers) { DeviceVelocityPtr vel = GetDevicePredictableAccelData(dev); if(!vel) return FALSE; - vel->prop_handlers[0] = AccelInitProfileProperty(dev, vel); - vel->prop_handlers[1] = AccelInitDecelProperty(dev, vel); - vel->prop_handlers[2] = AccelInitAdaptDecelProperty(dev, vel); - vel->prop_handlers[3] = AccelInitScaleProperty(dev, vel); + prop_handlers[0] = AccelInitProfileProperty(dev, vel); + prop_handlers[1] = AccelInitDecelProperty(dev, vel); + prop_handlers[2] = AccelInitAdaptDecelProperty(dev, vel); + prop_handlers[3] = AccelInitScaleProperty(dev, vel); return TRUE; } BOOL -DeletePredictableAccelerationProperties(DeviceIntPtr dev) +DeletePredictableAccelerationProperties( + DeviceIntPtr dev, + long* prop_handlers) { - DeviceVelocityPtr vel; + DeviceVelocityPtr vel; Atom prop; int i; @@ -379,8 +404,8 @@ DeletePredictableAccelerationProperties(DeviceIntPtr dev) vel = GetDevicePredictableAccelData(dev); for (i = 0; vel && i < NPROPS_PREDICTABLE_ACCEL; i++) - if (vel->prop_handlers[i]) - XIUnregisterPropertyHandler(dev, vel->prop_handlers[i]); + if (prop_handlers[i]) + XIUnregisterPropertyHandler(dev, prop_handlers[i]); return TRUE; } @@ -397,8 +422,7 @@ InitTrackers(DeviceVelocityPtr vel, int ntracker) return; } free(vel->tracker); - vel->tracker = (MotionTrackerPtr)malloc(ntracker * sizeof(MotionTracker)); - memset(vel->tracker, 0, ntracker * sizeof(MotionTracker)); + vel->tracker = (MotionTrackerPtr)calloc(ntracker, sizeof(MotionTracker)); vel->num_tracker = ntracker; } @@ -1026,7 +1050,8 @@ GetDevicePredictableAccelData( acceleratePointerPredictable && dev->valuator->accelScheme.accelData != NULL){ - return (DeviceVelocityPtr)dev->valuator->accelScheme.accelData; + return ((PredictableAccelSchemePtr) + dev->valuator->accelScheme.accelData)->vel; } return NULL; } diff --git a/include/ptrveloc.h b/include/ptrveloc.h index 8c59c03..94cf8c9 100644 --- a/include/ptrveloc.h +++ b/include/ptrveloc.h @@ -62,9 +62,6 @@ typedef struct _MotionTracker { int dir; /* initial direction bitfield */ } MotionTracker, *MotionTrackerPtr; -/* number of properties for predictable acceleration */ -#define NPROPS_PREDICTABLE_ACCEL 4 - /** * Contains all data needed to implement mouse ballistics */ @@ -91,9 +88,17 @@ typedef struct _DeviceVelocityRec { struct { /* to be able to query this information */ int profile_number; } statistics; - long prop_handlers[NPROPS_PREDICTABLE_ACCEL]; } DeviceVelocityRec, *DeviceVelocityPtr; +/** + * contains the run-time data for the predictable scheme, that is, a + * DeviceVelocityPtr and the property handlers. + */ +typedef struct _PredictableAccelSchemeRec { + DeviceVelocityPtr vel; + long* prop_handlers; +} PredictableAccelSchemeRec, *PredictableAccelSchemePtr; + extern _X_EXPORT void InitVelocityData(DeviceVelocityPtr vel); -- 1.7.3.4