diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2011-02-09 16:03:36 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2011-02-17 11:10:51 +1000 |
commit | 442527d44a07eceaf6d8b33f4b469e36afc0dcc5 (patch) | |
tree | ac3c7bc05fd97354c93a572b99cbddbf9be19e74 /src | |
parent | a785b831a6cdb14ea1c11b894cc1a84aea4a37fd (diff) |
Factor out edge speed calculation.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Chris Bagwell <chris@cnpbagwell.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/synaptics.c | 78 |
1 files changed, 43 insertions, 35 deletions
diff --git a/src/synaptics.c b/src/synaptics.c index 2201e9f..4cc715d 100644 --- a/src/synaptics.c +++ b/src/synaptics.c @@ -1728,6 +1728,47 @@ get_delta_for_trackstick(SynapticsPrivate *priv, const struct SynapticsHwState * } static void +get_edge_speed(SynapticsPrivate *priv, const struct SynapticsHwState *hw, + edge_type edge, int *x_edge_speed, int *y_edge_speed) +{ + SynapticsParameters *para = &priv->synpara; + + int minZ = para->edge_motion_min_z; + int maxZ = para->edge_motion_max_z; + int minSpd = para->edge_motion_min_speed; + int maxSpd = para->edge_motion_max_speed; + int edge_speed; + + if (hw->z <= minZ) { + edge_speed = minSpd; + } else if (hw->z >= maxZ) { + edge_speed = maxSpd; + } else { + edge_speed = minSpd + (hw->z - minZ) * (maxSpd - minSpd) / (maxZ - minZ); + } + if (!priv->synpara.circular_pad) { + /* on rectangular pad */ + if (edge & RIGHT_EDGE) { + *x_edge_speed = edge_speed; + } else if (edge & LEFT_EDGE) { + *x_edge_speed = -edge_speed; + } + if (edge & TOP_EDGE) { + *y_edge_speed = -edge_speed; + } else if (edge & BOTTOM_EDGE) { + *y_edge_speed = edge_speed; + } + } else if (edge) { + /* at edge of circular pad */ + double relX, relY; + + relative_coords(priv, hw->x, hw->y, &relX, &relY); + *x_edge_speed = (int)(edge_speed * relX); + *y_edge_speed = (int)(edge_speed * relY); + } +} + +static void get_delta(SynapticsPrivate *priv, const struct SynapticsHwState *hw, edge_type edge, double *dx, double *dy) { @@ -1741,41 +1782,8 @@ get_delta(SynapticsPrivate *priv, const struct SynapticsHwState *hw, *dx = estimate_delta(hw->x, HIST(0).x, HIST(1).x, HIST(2).x); *dy = estimate_delta(hw->y, HIST(0).y, HIST(1).y, HIST(2).y); - if ((priv->tap_state == TS_DRAG) || para->edge_motion_use_always) { - int minZ = para->edge_motion_min_z; - int maxZ = para->edge_motion_max_z; - int minSpd = para->edge_motion_min_speed; - int maxSpd = para->edge_motion_max_speed; - int edge_speed; - - if (hw->z <= minZ) { - edge_speed = minSpd; - } else if (hw->z >= maxZ) { - edge_speed = maxSpd; - } else { - edge_speed = minSpd + (hw->z - minZ) * (maxSpd - minSpd) / (maxZ - minZ); - } - if (!priv->synpara.circular_pad) { - /* on rectangular pad */ - if (edge & RIGHT_EDGE) { - x_edge_speed = edge_speed; - } else if (edge & LEFT_EDGE) { - x_edge_speed = -edge_speed; - } - if (edge & TOP_EDGE) { - y_edge_speed = -edge_speed; - } else if (edge & BOTTOM_EDGE) { - y_edge_speed = edge_speed; - } - } else if (edge) { - /* at edge of circular pad */ - double relX, relY; - - relative_coords(priv, hw->x, hw->y, &relX, &relY); - x_edge_speed = (int)(edge_speed * relX); - y_edge_speed = (int)(edge_speed * relY); - } - } + if ((priv->tap_state == TS_DRAG) || para->edge_motion_use_always) + get_edge_speed(priv, hw, edge, &x_edge_speed, &y_edge_speed); /* report edge speed as synthetic motion. Of course, it would be * cooler to report floats than to buffer, but anyway. */ |