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 xorg@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/xorg