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>
This commit is contained in:
Simon Thum 2011-02-23 02:29:33 +01:00 committed by Peter Hutterer
parent edcceedbd3
commit 8128846e16
2 changed files with 68 additions and 34 deletions

View File

@ -30,6 +30,7 @@
#include <ptrveloc.h> #include <ptrveloc.h>
#include <exevents.h> #include <exevents.h>
#include <X11/Xatom.h> #include <X11/Xatom.h>
#include <os.h>
#include <xserver-properties.h> #include <xserver-properties.h>
@ -68,9 +69,12 @@ SimpleSmoothProfile(DeviceIntPtr dev, DeviceVelocityPtr vel, float velocity,
static PointerAccelerationProfileFunc static PointerAccelerationProfileFunc
GetAccelerationProfile(DeviceVelocityPtr vel, int profile_num); GetAccelerationProfile(DeviceVelocityPtr vel, int profile_num);
static BOOL static BOOL
InitializePredictableAccelerationProperties(DeviceIntPtr dev); InitializePredictableAccelerationProperties(DeviceIntPtr,
DeviceVelocityPtr,
PredictableAccelSchemePtr);
static BOOL static BOOL
DeletePredictableAccelerationProperties(DeviceIntPtr dev); DeletePredictableAccelerationProperties(DeviceIntPtr,
PredictableAccelSchemePtr);
/*#define PTRACCEL_DEBUGGING*/ /*#define PTRACCEL_DEBUGGING*/
@ -87,7 +91,6 @@ DeletePredictableAccelerationProperties(DeviceIntPtr dev);
/* some int which is not a profile number */ /* some int which is not a profile number */
#define PROFILE_UNINITIALIZE (-100) #define PROFILE_UNINITIALIZE (-100)
/** /**
* Init DeviceVelocity struct so it should match the average case * Init DeviceVelocity struct so it should match the average case
*/ */
@ -125,17 +128,22 @@ FreeVelocityData(DeviceVelocityPtr vel){
*/ */
Bool Bool
InitPredictableAccelerationScheme(DeviceIntPtr dev, InitPredictableAccelerationScheme(DeviceIntPtr dev,
ValuatorAccelerationPtr protoScheme) { ValuatorAccelerationPtr protoScheme) {
DeviceVelocityPtr vel; DeviceVelocityPtr vel;
ValuatorAccelerationRec scheme; ValuatorAccelerationRec scheme;
PredictableAccelSchemePtr schemeData;
scheme = *protoScheme; scheme = *protoScheme;
vel = calloc(1, sizeof(DeviceVelocityRec)); vel = calloc(1, sizeof(DeviceVelocityRec));
if (!vel) schemeData = calloc(1, sizeof(PredictableAccelSchemeRec));
return FALSE; if (!vel || !schemeData)
return FALSE;
InitVelocityData(vel); 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; dev->valuator->accelScheme = scheme;
InitializePredictableAccelerationProperties(dev);
return TRUE; return TRUE;
} }
@ -146,14 +154,21 @@ InitPredictableAccelerationScheme(DeviceIntPtr dev,
void void
AccelerationDefaultCleanup(DeviceIntPtr dev) AccelerationDefaultCleanup(DeviceIntPtr dev)
{ {
/*sanity check*/ DeviceVelocityPtr vel = GetDevicePredictableAccelData(dev);
if( dev->valuator->accelScheme.AccelSchemeProc == acceleratePointerPredictable if (vel) {
&& dev->valuator->accelScheme.accelData != NULL){ /* 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; 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); free(dev->valuator->accelScheme.accelData);
dev->valuator->accelScheme.accelData = NULL; dev->valuator->accelScheme.accelData = NULL;
DeletePredictableAccelerationProperties(dev); OsReleaseSignals();
} }
} }
@ -345,26 +360,34 @@ AccelInitScaleProperty(DeviceIntPtr dev, DeviceVelocityPtr vel)
return XIRegisterPropertyHandler(dev, AccelSetScaleProperty, NULL, NULL); return XIRegisterPropertyHandler(dev, AccelSetScaleProperty, NULL, NULL);
} }
BOOL static BOOL
InitializePredictableAccelerationProperties(DeviceIntPtr dev) InitializePredictableAccelerationProperties(
DeviceIntPtr dev,
DeviceVelocityPtr vel,
PredictableAccelSchemePtr schemeData)
{ {
DeviceVelocityPtr vel = GetDevicePredictableAccelData(dev); int num_handlers = 4;
if(!vel) if(!vel)
return FALSE; return FALSE;
vel->prop_handlers[0] = AccelInitProfileProperty(dev, vel); schemeData->prop_handlers = calloc(num_handlers, sizeof(long));
vel->prop_handlers[1] = AccelInitDecelProperty(dev, vel); if (!schemeData->prop_handlers)
vel->prop_handlers[2] = AccelInitAdaptDecelProperty(dev, vel); return FALSE;
vel->prop_handlers[3] = AccelInitScaleProperty(dev, vel); 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; return TRUE;
} }
BOOL BOOL
DeletePredictableAccelerationProperties(DeviceIntPtr dev) DeletePredictableAccelerationProperties(
DeviceIntPtr dev,
PredictableAccelSchemePtr scheme)
{ {
DeviceVelocityPtr vel; DeviceVelocityPtr vel;
Atom prop; Atom prop;
int i; int i;
@ -378,10 +401,15 @@ DeletePredictableAccelerationProperties(DeviceIntPtr dev)
XIDeleteDeviceProperty(dev, prop, FALSE); XIDeleteDeviceProperty(dev, prop, FALSE);
vel = GetDevicePredictableAccelData(dev); vel = GetDevicePredictableAccelData(dev);
for (i = 0; vel && i < NPROPS_PREDICTABLE_ACCEL; i++) if (vel) {
if (vel->prop_handlers[i]) for (i = 0; i < scheme->num_prop_handlers; i++)
XIUnregisterPropertyHandler(dev, vel->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; return TRUE;
} }
@ -397,8 +425,7 @@ InitTrackers(DeviceVelocityPtr vel, int ntracker)
return; return;
} }
free(vel->tracker); free(vel->tracker);
vel->tracker = (MotionTrackerPtr)malloc(ntracker * sizeof(MotionTracker)); vel->tracker = (MotionTrackerPtr)calloc(ntracker, sizeof(MotionTracker));
memset(vel->tracker, 0, ntracker * sizeof(MotionTracker));
vel->num_tracker = ntracker; vel->num_tracker = ntracker;
} }
@ -1026,7 +1053,8 @@ GetDevicePredictableAccelData(
acceleratePointerPredictable && acceleratePointerPredictable &&
dev->valuator->accelScheme.accelData != NULL){ dev->valuator->accelScheme.accelData != NULL){
return (DeviceVelocityPtr)dev->valuator->accelScheme.accelData; return ((PredictableAccelSchemePtr)
dev->valuator->accelScheme.accelData)->vel;
} }
return NULL; return NULL;
} }

View File

@ -62,9 +62,6 @@ typedef struct _MotionTracker {
int dir; /* initial direction bitfield */ int dir; /* initial direction bitfield */
} MotionTracker, *MotionTrackerPtr; } MotionTracker, *MotionTrackerPtr;
/* number of properties for predictable acceleration */
#define NPROPS_PREDICTABLE_ACCEL 4
/** /**
* Contains all data needed to implement mouse ballistics * Contains all data needed to implement mouse ballistics
*/ */
@ -91,9 +88,18 @@ typedef struct _DeviceVelocityRec {
struct { /* to be able to query this information */ struct { /* to be able to query this information */
int profile_number; int profile_number;
} statistics; } statistics;
long prop_handlers[NPROPS_PREDICTABLE_ACCEL];
} DeviceVelocityRec, *DeviceVelocityPtr; } 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 extern _X_EXPORT void
InitVelocityData(DeviceVelocityPtr vel); InitVelocityData(DeviceVelocityPtr vel);