diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2010-06-07 11:28:42 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2010-06-07 11:28:42 +1000 |
commit | 3c26383af55b6b3599666cfa9693ec04aaecef02 (patch) | |
tree | c0db146d1f4fee669370853e265b74e76ff61227 | |
parent | 144210ab4962c5b00fea4fdc4f01050841a8d67c (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.c | 123 |
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; } |