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

Reply via email to