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:
parent
edcceedbd3
commit
8128846e16
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -128,14 +131,19 @@ 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));
|
||||||
|
if (!vel || !schemeData)
|
||||||
return FALSE;
|
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,24 +360,32 @@ 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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue