diff options
author | Hans de Goede <hdegoede@redhat.com> | 2014-02-21 10:31:43 +0100 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2014-04-30 12:53:59 +1000 |
commit | ad834529c3fb63ced0ed74efb6c382d1761467c8 (patch) | |
tree | 858015ae784629558cf7e13af50b60b103ea0dc2 /src | |
parent | db920ba696d7870b1b074ae2daff1e93a7296b99 (diff) |
On button down update cumulative to current x and y, instead of previous
When a button click and new coordinates get reported in one go we sync the
cumulative coordinates to the old x and y, rather then the newly reported ones.
This keeping of the old coordinates causes the following issue:
-touch the touchpad in its right click area
-let go of the touchpad
-rapidly click in the left click area (or middle area), so that the
new location and the click get reported in one syn (may require some
practicing with evemu-record to reproduce)
-the driver registers the click as a right click because it uses the
old coordinates from the cumulative coordinates to determine the
click location
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 743c45b9cfd057d00c37dab1cfca4b6202fb2642)
Diffstat (limited to 'src')
-rw-r--r-- | src/eventcomm.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/eventcomm.c b/src/eventcomm.c index d3795c1..94f6bc7 100644 --- a/src/eventcomm.c +++ b/src/eventcomm.c @@ -663,6 +663,7 @@ EventReadHwState(InputInfoPtr pInfo, SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; SynapticsParameters *para = &priv->synpara; struct eventcomm_proto_data *proto_data = priv->proto_data; + Bool sync_cumulative = FALSE; SynapticsResetTouchHwState(hw, FALSE); @@ -670,6 +671,7 @@ EventReadHwState(InputInfoPtr pInfo, if (!hw->left && !hw->right && !hw->middle) { hw->cumulative_dx = hw->x; hw->cumulative_dy = hw->y; + sync_cumulative = TRUE; } while (SynapticsReadEvent(pInfo, &ev)) { @@ -745,9 +747,13 @@ EventReadHwState(InputInfoPtr pInfo, switch (ev.code) { case ABS_X: hw->x = apply_st_scaling(proto_data, ev.value, 0); + if (sync_cumulative) + hw->cumulative_dx = hw->x; break; case ABS_Y: hw->y = apply_st_scaling(proto_data, ev.value, 1); + if (sync_cumulative) + hw->cumulative_dy = hw->y; break; case ABS_PRESSURE: hw->z = ev.value; |