summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2010-06-07 11:28:42 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2010-06-07 11:28:42 +1000
commit3c26383af55b6b3599666cfa9693ec04aaecef02 (patch)
treec0db146d1f4fee669370853e265b74e76ff61227
parent144210ab4962c5b00fea4fdc4f01050841a8d67c (diff)
Revert "Setup pointer acceleration for synaptics"
Merged the wrong patch, right patch is the follow-up commit. This reverts commit a489ec15eb489a3528f6fee99716f7f4ae35f9ee.
-rw-r--r--src/synaptics.c123
1 files changed, 35 insertions, 88 deletions
diff --git a/src/synaptics.c b/src/synaptics.c
index ff3c945..589d04a 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -80,7 +80,6 @@
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
#include <X11/Xatom.h>
#include <xserver-properties.h>
-#include <ptrveloc.h>
#endif
typedef enum {
@@ -547,45 +546,6 @@ static void set_default_parameters(LocalDevicePtr local)
}
}
-static float SynapticsAccelerationProfile
- (DeviceIntPtr dev,
- DeviceVelocityPtr vel,
- float velocity,
- float thr,
- float acc) {
- LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate;
- SynapticsPrivate *priv = (SynapticsPrivate *) (local->private);
- SynapticsParameters* para = &priv->synpara;
-
- double accelfct;
-
- /* speed up linear with finger velocity */
- accelfct = velocity * para->accl;
-
- /* clip acceleration factor */
- if (accelfct > para->max_speed)
- accelfct = para->max_speed;
- else if (accelfct < para->min_speed)
- accelfct = para->min_speed;
-
- /* modify speed according to pressure */
- if (priv->moving_state == MS_TOUCHPAD_RELATIVE) {
- int minZ = para->press_motion_min_z;
- int maxZ = para->press_motion_max_z;
- double minFctr = para->press_motion_min_factor;
- double maxFctr = para->press_motion_max_factor;
- if (priv->hwState.z <= minZ) {
- accelfct *= minFctr;
- } else if (priv->hwState.z >= maxZ) {
- accelfct *= maxFctr;
- } else {
- accelfct *= minFctr + (priv->hwState.z - minZ) * (maxFctr - minFctr) / (maxZ - minZ);
- }
- }
-
- return accelfct;
-}
-
/*
* called by the module loader for initialization
*/
@@ -895,15 +855,12 @@ DeviceInit(DeviceIntPtr dev)
{
LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate;
SynapticsPrivate *priv = (SynapticsPrivate *) (local->private);
- Atom float_type, prop;
- float tmpf;
unsigned char map[SYN_MAX_BUTTONS + 1];
int i;
int min, max;
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
Atom btn_labels[SYN_MAX_BUTTONS] = { 0 };
Atom axes_labels[2] = { 0 };
- DeviceVelocityPtr pVel;
InitAxesLabels(axes_labels, 2);
InitButtonLabels(btn_labels, SYN_MAX_BUTTONS);
@@ -936,46 +893,6 @@ DeviceInit(DeviceIntPtr dev)
, axes_labels
#endif
);
-
- /*
- * setup dix acceleration to match legacy synaptics settings, and
- * etablish a device-specific profile to do stuff like pressure-related
- * acceleration.
- */
-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
- if (NULL != (pVel = GetDevicePredictableAccelData(dev))) {
- SetDeviceSpecificAccelerationProfile(pVel, SynapticsAccelerationProfile);
-
- /* float property type */
- float_type = XIGetKnownProperty(XATOM_FLOAT);
-
- /* translate MinAcc to constant deceleration.
- * May be overridden in xf86IVD */
- tmpf = 1.0 / priv->synpara.min_speed;
-
- xf86Msg(X_CONFIG, "%s: (accel) MinSpeed is now constant deceleration %.1f\n",
- dev->name, tmpf);
- prop = XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION);
- XIChangeDeviceProperty(dev, prop, float_type, 32,
- PropModeReplace, 1, &tmpf, FALSE);
-
- /* adjust accordingly */
- priv->synpara.max_speed /= priv->synpara.min_speed;
- /* leave priv->synpara.accl alone since velocity includes const decel */
- priv->synpara.min_speed = 1.0;
-
- xf86Msg(X_CONFIG, "%s: MaxSpeed is now %.1f\n",
- dev->name, priv->synpara.max_speed);
- xf86Msg(X_CONFIG, "%s: AccelFactor is now %.1f\n",
- dev->name, priv->synpara.accl);
-
- prop = XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER);
- i = AccelProfileDeviceSpecific;
- XIChangeDeviceProperty(dev, prop, XA_INTEGER, 32,
- PropModeReplace, 1, &i, FALSE);
- }
-#endif
-
/* X valuator */
if (priv->minx < priv->maxx)
{
@@ -1027,6 +944,11 @@ DeviceInit(DeviceIntPtr dev)
return Success;
}
+static int
+move_distance(int dx, int dy)
+{
+ return sqrt(SQR(dx) + SQR(dy));
+}
/*
* Convert from absolute X/Y coordinates to a coordinate system where
@@ -1667,8 +1589,9 @@ ComputeDeltas(SynapticsPrivate *priv, const struct SynapticsHwState *hw,
{
SynapticsParameters *para = &priv->synpara;
enum MovingState moving_state;
+ int dist;
double dx, dy;
- double integral;
+ double speed, integral;
int delay = 1000000000;
dx = dy = 0;
@@ -1749,12 +1672,36 @@ ComputeDeltas(SynapticsPrivate *priv, const struct SynapticsHwState *hw,
}
}
- /* report edge speed as synthetic motion. Of course, it would be
- * cooler to report floats than to buffer, but anyway. */
- tmpf = dx + x_edge_speed * dtime + priv->frac_x;
+ /* speed depending on distance/packet */
+ dist = move_distance(dx, dy);
+ speed = dist * para->accl;
+ if (speed > para->max_speed) { /* set max speed factor */
+ speed = para->max_speed;
+ } else if (speed < para->min_speed) { /* set min speed factor */
+ speed = para->min_speed;
+ }
+
+ /* modify speed according to pressure */
+ if (priv->moving_state == MS_TOUCHPAD_RELATIVE) {
+ int minZ = para->press_motion_min_z;
+ int maxZ = para->press_motion_max_z;
+ double minFctr = para->press_motion_min_factor;
+ double maxFctr = para->press_motion_max_factor;
+
+ if (hw->z <= minZ) {
+ speed *= minFctr;
+ } else if (hw->z >= maxZ) {
+ speed *= maxFctr;
+ } else {
+ speed *= minFctr + (hw->z - minZ) * (maxFctr - minFctr) / (maxZ - minZ);
+ }
+ }
+
+ /* save the fraction, report the integer part */
+ tmpf = dx * speed + x_edge_speed * dtime + priv->frac_x;
priv->frac_x = modf(tmpf, &integral);
dx = integral;
- tmpf = dy + y_edge_speed * dtime + priv->frac_y;
+ tmpf = dy * speed + y_edge_speed * dtime + priv->frac_y;
priv->frac_y = modf(tmpf, &integral);
dy = integral;
}