summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Thum <simon.thum@gmx.de>2010-01-01 19:58:05 +0100
committerKeith Packard <keithp@keithp.com>2010-01-01 11:22:42 -0800
commit1763550d0181ac1c775b9ddf490114eff2fbe67e (patch)
tree59315a3b06c641a48b56c9ef905b4dfb323046f3
parent435f27667f84269768efecde34de4af2b2d43376 (diff)
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>
-rw-r--r--dix/ptrveloc.c28
-rw-r--r--include/ptrveloc.h3
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;