diff options
author | Simon Thum <simon.thum@gmx.de> | 2011-02-23 02:29:33 +0100 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2011-03-02 14:47:58 +1000 |
commit | 8128846e16b406c7d459ae7556f7cd09bdc24c91 (patch) | |
tree | 311e1e77398b0c9bace281aaf5668b183b5c38db | |
parent | edcceedbd35df576929685767d0b619659e5b020 (diff) |
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 <simon.thum@gmx.de>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | dix/ptrveloc.c | 88 | ||||
-rw-r--r-- | include/ptrveloc.h | 14 |
2 files changed, 68 insertions, 34 deletions
diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c index e6ac2ed14..3b0c75a58 100644 --- a/dix/ptrveloc.c +++ b/dix/ptrveloc.c @@ -30,6 +30,7 @@ #include <ptrveloc.h> #include <exevents.h> #include <X11/Xatom.h> +#include <os.h> #include <xserver-properties.h> @@ -68,9 +69,12 @@ SimpleSmoothProfile(DeviceIntPtr dev, DeviceVelocityPtr vel, float velocity, static PointerAccelerationProfileFunc GetAccelerationProfile(DeviceVelocityPtr vel, int profile_num); static BOOL -InitializePredictableAccelerationProperties(DeviceIntPtr dev); +InitializePredictableAccelerationProperties(DeviceIntPtr, + DeviceVelocityPtr, + PredictableAccelSchemePtr); static BOOL -DeletePredictableAccelerationProperties(DeviceIntPtr dev); +DeletePredictableAccelerationProperties(DeviceIntPtr, + PredictableAccelSchemePtr); /*#define PTRACCEL_DEBUGGING*/ @@ -87,7 +91,6 @@ DeletePredictableAccelerationProperties(DeviceIntPtr dev); /* some int which is not a profile number */ #define PROFILE_UNINITIALIZE (-100) - /** * Init DeviceVelocity struct so it should match the average case */ @@ -125,17 +128,22 @@ 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; + scheme.accelData = schemeData; + if (!InitializePredictableAccelerationProperties(dev, vel, schemeData)) + return FALSE; + /* all fine, assign scheme to device */ dev->valuator->accelScheme = scheme; - InitializePredictableAccelerationProperties(dev); return TRUE; } @@ -146,14 +154,21 @@ InitPredictableAccelerationScheme(DeviceIntPtr dev, void AccelerationDefaultCleanup(DeviceIntPtr dev) { - /*sanity check*/ - if( dev->valuator->accelScheme.AccelSchemeProc == acceleratePointerPredictable - && dev->valuator->accelScheme.accelData != NULL){ + DeviceVelocityPtr vel = GetDevicePredictableAccelData(dev); + if (vel) { + /* the proper guarantee would be that we're not inside of + * AccelSchemeProc(), but that seems impossible. Schemes don't get + * switched often anyway. + */ + OsBlockSignals(); dev->valuator->accelScheme.AccelSchemeProc = NULL; - FreeVelocityData(dev->valuator->accelScheme.accelData); + FreeVelocityData(vel); + free(vel); + DeletePredictableAccelerationProperties(dev, + (PredictableAccelSchemePtr) dev->valuator->accelScheme.accelData); free(dev->valuator->accelScheme.accelData); dev->valuator->accelScheme.accelData = NULL; - DeletePredictableAccelerationProperties(dev); + OsReleaseSignals(); } } @@ -345,26 +360,34 @@ AccelInitScaleProperty(DeviceIntPtr dev, DeviceVelocityPtr vel) return XIRegisterPropertyHandler(dev, AccelSetScaleProperty, NULL, NULL); } -BOOL -InitializePredictableAccelerationProperties(DeviceIntPtr dev) +static BOOL +InitializePredictableAccelerationProperties( + DeviceIntPtr dev, + DeviceVelocityPtr vel, + PredictableAccelSchemePtr schemeData) { - DeviceVelocityPtr vel = GetDevicePredictableAccelData(dev); - + int num_handlers = 4; if(!vel) - return FALSE; + 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); + schemeData->prop_handlers = calloc(num_handlers, sizeof(long)); + if (!schemeData->prop_handlers) + return FALSE; + schemeData->num_prop_handlers = num_handlers; + schemeData->prop_handlers[0] = AccelInitProfileProperty(dev, vel); + schemeData->prop_handlers[1] = AccelInitDecelProperty(dev, vel); + schemeData->prop_handlers[2] = AccelInitAdaptDecelProperty(dev, vel); + schemeData->prop_handlers[3] = AccelInitScaleProperty(dev, vel); return TRUE; } BOOL -DeletePredictableAccelerationProperties(DeviceIntPtr dev) +DeletePredictableAccelerationProperties( + DeviceIntPtr dev, + PredictableAccelSchemePtr scheme) { - DeviceVelocityPtr vel; + DeviceVelocityPtr vel; Atom prop; int i; @@ -378,10 +401,15 @@ DeletePredictableAccelerationProperties(DeviceIntPtr dev) XIDeleteDeviceProperty(dev, prop, FALSE); vel = GetDevicePredictableAccelData(dev); - for (i = 0; vel && i < NPROPS_PREDICTABLE_ACCEL; i++) - if (vel->prop_handlers[i]) - XIUnregisterPropertyHandler(dev, vel->prop_handlers[i]); + if (vel) { + for (i = 0; i < scheme->num_prop_handlers; i++) + if (scheme->prop_handlers[i]) + XIUnregisterPropertyHandler(dev, scheme->prop_handlers[i]); + } + free(scheme->prop_handlers); + scheme->prop_handlers = NULL; + scheme->num_prop_handlers = 0; return TRUE; } @@ -397,8 +425,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 +1053,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 8c59c0361..5c57d42e7 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,18 @@ 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; + int num_prop_handlers; +} PredictableAccelSchemeRec, *PredictableAccelSchemePtr; + extern _X_EXPORT void InitVelocityData(DeviceVelocityPtr vel); |