diff options
-rw-r--r-- | dix/ptrveloc.c | 28 | ||||
-rw-r--r-- | include/ptrveloc.h | 3 |
2 files changed, 29 insertions, 2 deletions
diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c index 6fb9e2122..c2f43784c 100644 --- a/dix/ptrveloc.c +++ b/dix/ptrveloc.c @@ -868,6 +868,31 @@ SmoothLinearProfile( } +/** + * From 0 to threshold, the response graduates smoothly from min_accel to + * acceleration. Beyond threshold it is exactly the specified acceleration. + */ +static float +SmoothLimitedProfile( + DeviceIntPtr dev, + DeviceVelocityPtr vel, + float velocity, + float threshold, + float acc) +{ + float res; + + if(velocity >= threshold || threshold == 0.0f) + return acc; + + velocity /= threshold; /* should be [0..1[ now */ + + res = CalcPenumbralGradient(velocity) * (acc - vel->min_acceleration); + + return vel->min_acceleration + res; +} + + static float LinearProfile( DeviceIntPtr dev, @@ -879,7 +904,6 @@ LinearProfile( return acc * velocity; } - static float NoProfile( DeviceIntPtr dev, @@ -911,6 +935,8 @@ GetAccelerationProfile( return PowerProfile; case AccelProfileLinear: return LinearProfile; + case AccelProfileSmoothLimited: + return SmoothLimitedProfile; case AccelProfileNone: return NoProfile; default: diff --git a/include/ptrveloc.h b/include/ptrveloc.h index 2a4b40b19..676c46419 100644 --- a/include/ptrveloc.h +++ b/include/ptrveloc.h @@ -37,7 +37,8 @@ #define AccelProfileSimple 4 #define AccelProfilePower 5 #define AccelProfileLinear 6 -#define AccelProfileLAST AccelProfileLinear +#define AccelProfileSmoothLimited 7 +#define AccelProfileLAST AccelProfileSmoothLimited /* fwd */ struct _DeviceVelocityRec; |