Hello, I have a Dell Inspiron 1520 with a Synaptics touchpad. This touchpad for
a unknown reason loves to send event like these after every finger release :
time x y z f w l r u d m multi gl gm gr gdx gdy
1.563 3224 1625 57 1 5 0 0 0 0 0 00000000 0 0 0 0 0
1.574 3251 1632 30 1 5 0 0 0 0 0 00000000 0 0 0 0 0
1.584 3292 1673 10 1 5 0 0 0 0 0 00000000 0 0 0 0 0
1.594 1 5855 3 2 5 0 0 0 0 0 00000000 0 0 0 0 0
1.634 1 5855 1 2 5 0 0 0 0 0 00000000 0 0 0 0 0
1.746 1 5855 0 0 0 0 0 0 0 0 00000000 0 0 0 0 0
1.897 1 5855 1 2 5 0 0 0 0 0 00000000 0 0 0 0 0
Most of the time these events are ignored by the driver. but sometimes
it confuse two-finger scrolling and tap detection.
For example, in this log, the first tap is recognized, the second isn't :
time x y z f w l r u d m multi gl gm gr gdx gdy
11.597 1 5855 1 2 5 0 0 0 0 0 00000000 0 0 0 0 0
11.678 1 5855 0 0 0 0 0 0 0 0 00000000 0 0 0 0 0
11.688 1 5855 1 2 5 0 0 0 0 0 00000000 0 0 0 0 0
11.709 3862 2406 8 1 5 0 0 0 0 0 00000000 0 0 0 0 0
11.719 3851 2464 67 1 5 0 0 0 0 0 00000000 0 0 0 0 0
11.729 3849 2407 35 1 4 0 0 0 0 0 00000000 0 0 0 0 0
11.739 3858 2578 5 1 9 0 0 0 0 0 00000000 0 0 0 0 0
11.749 3858 2578 0 0 0 0 0 0 0 0 00000000 0 0 0 0 0
11.850 1 5855 1 2 5 0 0 0 0 0 00000000 0 0 0 0 0
11.860 1 5855 0 0 0 0 0 0 0 0 00000000 0 0 0 0 0
12.073 1 5855 1 2 5 0 0 0 0 0 00000000 0 0 0 0 0
12.083 1 5855 0 0 0 0 0 0 0 0 00000000 0 0 0 0 0
12.347 1 5855 4 2 5 0 0 0 0 0 00000000 0 0 0 0 0
12.357 3844 2381 56 1 4 0 0 0 0 0 00000000 0 0 0 0 0
12.377 3848 2361 32 1 4 0 0 0 0 0 00000000 0 0 0 0 0
12.388 1 5855 3 2 5 0 0 0 0 0 00000000 0 0 0 0 0
12.398 1 5855 1 2 5 0 0 0 0 0 00000000 0 0 0 0 0
12.408 1 5855 0 0 0 0 0 0 0 0 00000000 0 0 0 0 0
12.428 1 5855 1 2 5 0 0 0 0 0 00000000 0 0 0 0 0
The problem with the second tap is that the driver check if the movement from
(3848,2361) to (1,5855) is over TapMaxMove before it checks for a finger
release.
So the driver considers it as a (short) finger move.
The first patch add the condition ''the finger is still present'' to
the 'move' condition.
The other problem is with double-finger scrolling. In this log, the driver
send hundred of scroll-down events :
2.457 3220 2025 75 2 5 0 0 0 0 0 00000000 0 0 0 0 0
2.467 3244 1933 75 2 5 0 0 0 0 0 00000000 0 0 0 0 0
2.477 3275 1864 75 2 5 0 0 0 0 0 00000000 0 0 0 0 0
2.488 3329 1835 21 2 5 0 0 0 0 0 00000000 0 0 0 0 0
2.508 3461 1803 7 2 5 0 0 0 0 0 00000000 0 0 0 0 0
2.519 1 5855 2 2 5 0 0 0 0 0 00000000 0 0 0 0 0
2.631 1 5855 0 0 0 0 0 0 0 0 00000000 0 0 0 0 0
2.904 1 5855 1 2 5 0 0 0 0 0 00000000 0 0 0 0 0
It's in fact scrolling from 1803 to 5855 because num_finger is still == 2.
The second patch stops two-finger scrolling when the ''finger'' variable is
false.
Oh, and thanks for maintaining this driver. :) i tried to contact previous
upstream but they didn't answer.
diff --git a/src/synaptics.c b/src/synaptics.c
index df29358..15fb636 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1249,7 +1249,7 @@ HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw,
release = !finger && priv->finger_state;
move = ((priv->tap_max_fingers <= ((priv->horiz_scroll_twofinger_on || priv->vert_scroll_twofinger_on)? 2 : 1)) &&
((abs(hw->x - priv->touch_on.x) >= para->tap_move) ||
- (abs(hw->y - priv->touch_on.y) >= para->tap_move)));
+ (abs(hw->y - priv->touch_on.y) >= para->tap_move)) && finger);
if (touch) {
priv->touch_on.x = hw->x;
diff --git a/src/synaptics.c b/src/synaptics.c
index df29358..15fb636 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -1671,7 +1671,7 @@ HandleScrolling(SynapticsPrivate *priv, struct SynapticsHwState *hw,
priv->circ_scroll_on = FALSE;
}
- if (hw->numFingers < 2) {
+ if (!finger || hw->numFingers < 2) {
if (priv->vert_scroll_twofinger_on) {
DBG(7, ErrorF("vert two-finger scroll off\n"));
priv->vert_scroll_twofinger_on = FALSE;
_______________________________________________
xorg mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/xorg