diff options
-rw-r--r-- | dix/devices.c | 2 | ||||
-rw-r--r-- | dix/ptrveloc.c | 64 | ||||
-rw-r--r-- | include/ptrveloc.h | 3 |
3 files changed, 57 insertions, 12 deletions
diff --git a/dix/devices.c b/dix/devices.c index 395e19acf..3634eece0 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -1235,6 +1235,8 @@ InitPointerAccelerationScheme(DeviceIntPtr dev, if(-1 == i) return FALSE; + if (val->accelScheme.AccelCleanupProc) + val->accelScheme.AccelCleanupProc(dev); /* init scheme-specific data */ switch(scheme){ diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c index 37c8e5178..6fb9e2122 100644 --- a/dix/ptrveloc.c +++ b/dix/ptrveloc.c @@ -83,6 +83,9 @@ GetAccelerationProfile(DeviceVelocityPtr vel, int profile_num); /* some int which is not a profile number */ #define PROFILE_UNINITIALIZE (-100) +/* number of properties for predictable acceleration */ +#define NPROPS_PREDICTABLE_ACCEL 4 + /** * Init struct so it should match the average case */ @@ -128,6 +131,7 @@ AccelerationDefaultCleanup(DeviceIntPtr dev) FreeVelocityData(dev->valuator->accelScheme.accelData); xfree(dev->valuator->accelScheme.accelData); dev->valuator->accelScheme.accelData = NULL; + DeletePredictableAccelerationProperties(dev); } } @@ -169,7 +173,7 @@ AccelSetProfileProperty(DeviceIntPtr dev, Atom atom, return Success; } -static void +static long AccelInitProfileProperty(DeviceIntPtr dev, DeviceVelocityPtr vel) { int profile = vel->statistics.profile_number; @@ -178,7 +182,7 @@ AccelInitProfileProperty(DeviceIntPtr dev, DeviceVelocityPtr vel) XIChangeDeviceProperty(dev, prop_profile_number, XA_INTEGER, 32, PropModeReplace, 1, &profile, FALSE); XISetDevicePropertyDeletable(dev, prop_profile_number, FALSE); - XIRegisterPropertyHandler(dev, AccelSetProfileProperty, NULL, NULL); + return XIRegisterPropertyHandler(dev, AccelSetProfileProperty, NULL, NULL); } /** @@ -214,7 +218,7 @@ AccelSetDecelProperty(DeviceIntPtr dev, Atom atom, return Success; } -static void +static long AccelInitDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr vel) { float fval = 1.0/vel->const_acceleration; @@ -223,7 +227,7 @@ AccelInitDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr vel) XIGetKnownProperty(XATOM_FLOAT), 32, PropModeReplace, 1, &fval, FALSE); XISetDevicePropertyDeletable(dev, prop_const_decel, FALSE); - XIRegisterPropertyHandler(dev, AccelSetDecelProperty, NULL, NULL); + return XIRegisterPropertyHandler(dev, AccelSetDecelProperty, NULL, NULL); } @@ -260,7 +264,7 @@ AccelSetAdaptDecelProperty(DeviceIntPtr dev, Atom atom, return Success; } -static void +static long AccelInitAdaptDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr vel) { float fval = 1.0/vel->min_acceleration; @@ -269,7 +273,7 @@ AccelInitAdaptDecelProperty(DeviceIntPtr dev, DeviceVelocityPtr vel) XIChangeDeviceProperty(dev, prop_adapt_decel, XIGetKnownProperty(XATOM_FLOAT), 32, PropModeReplace, 1, &fval, FALSE); XISetDevicePropertyDeletable(dev, prop_adapt_decel, FALSE); - XIRegisterPropertyHandler(dev, AccelSetAdaptDecelProperty, NULL, NULL); + return XIRegisterPropertyHandler(dev, AccelSetAdaptDecelProperty, NULL, NULL); } @@ -307,7 +311,7 @@ AccelSetScaleProperty(DeviceIntPtr dev, Atom atom, return Success; } -static void +static long AccelInitScaleProperty(DeviceIntPtr dev, DeviceVelocityPtr vel) { float fval = vel->corr_mul; @@ -316,21 +320,57 @@ AccelInitScaleProperty(DeviceIntPtr dev, DeviceVelocityPtr vel) XIChangeDeviceProperty(dev, prop_velo_scale, XIGetKnownProperty(XATOM_FLOAT), 32, PropModeReplace, 1, &fval, FALSE); XISetDevicePropertyDeletable(dev, prop_velo_scale, FALSE); - XIRegisterPropertyHandler(dev, AccelSetScaleProperty, NULL, NULL); + return XIRegisterPropertyHandler(dev, AccelSetScaleProperty, NULL, NULL); } +static int AccelPropHandlerPrivateKeyIndex; +DevPrivateKey AccelPropHandlerPrivateKey = &AccelPropHandlerPrivateKeyIndex; + BOOL InitializePredictableAccelerationProperties(DeviceIntPtr dev) { DeviceVelocityPtr vel = GetDevicePredictableAccelData(dev); + long *prop_handlers; if(!vel) return FALSE; + prop_handlers = xalloc(NPROPS_PREDICTABLE_ACCEL * sizeof(long)); + + prop_handlers[0] = AccelInitProfileProperty(dev, vel); + prop_handlers[1] = AccelInitDecelProperty(dev, vel); + prop_handlers[2] = AccelInitAdaptDecelProperty(dev, vel); + prop_handlers[3] = AccelInitScaleProperty(dev, vel); + + dixSetPrivate(&dev->devPrivates, AccelPropHandlerPrivateKey, + prop_handlers); + + return TRUE; +} + +BOOL +DeletePredictableAccelerationProperties(DeviceIntPtr dev) +{ + Atom prop; + long *prop_handlers; + int i; + + prop = XIGetKnownProperty(ACCEL_PROP_VELOCITY_SCALING); + XIDeleteDeviceProperty(dev, prop, FALSE); + prop = XIGetKnownProperty(ACCEL_PROP_ADAPTIVE_DECELERATION); + XIDeleteDeviceProperty(dev, prop, FALSE); + prop = XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION); + XIDeleteDeviceProperty(dev, prop, FALSE); + prop = XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER); + XIDeleteDeviceProperty(dev, prop, FALSE); + + prop_handlers = dixLookupPrivate(&dev->devPrivates, + AccelPropHandlerPrivateKey); + dixSetPrivate(&dev->devPrivates, AccelPropHandlerPrivateKey, NULL); + + for (i = 0; prop_handlers && i < NPROPS_PREDICTABLE_ACCEL; i++) + XIUnregisterPropertyHandler(dev, prop_handlers[i]); + xfree(prop_handlers); - AccelInitProfileProperty(dev, vel); - AccelInitDecelProperty(dev, vel); - AccelInitAdaptDecelProperty(dev, vel); - AccelInitScaleProperty(dev, vel); return TRUE; } diff --git a/include/ptrveloc.h b/include/ptrveloc.h index fa2156b0d..2a4b40b19 100644 --- a/include/ptrveloc.h +++ b/include/ptrveloc.h @@ -109,6 +109,9 @@ FreeVelocityData(DeviceVelocityPtr vel); extern _X_INTERNAL BOOL InitializePredictableAccelerationProperties(DeviceIntPtr dev); +extern _X_INTERNAL BOOL +DeletePredictableAccelerationProperties(DeviceIntPtr dev); + extern _X_EXPORT int SetAccelerationProfile(DeviceVelocityPtr vel, int profile_num); |