dix: add smooth limited pointer acceleration profile

This profile is inspired by the accel code removed from the wacom driver.
It ascends from zero to acceleration, maxing out at threshold. This means you
can control the slope using threshold, which wasn't possible in wacom.
For sanity's sake, threshold should grow with acceleration.

Works best with adaptive deceleration, since otherwise it only generates
acceleration above 1, causing seldom pixel skips.

Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Simon Thum 2010-01-01 19:58:05 +01:00 committed by Keith Packard
parent 435f27667f
commit 1763550d01
2 changed files with 29 additions and 2 deletions

View File

@ -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:

View File

@ -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;