summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;