Input: mousedev - fix sudden warps with touchpads
authorDmitry Torokhov <dtor@insightbb.com>
Thu, 12 Apr 2007 05:31:55 +0000 (01:31 -0400)
committerDmitry Torokhov <dtor@insightbb.com>
Thu, 12 Apr 2007 05:31:55 +0000 (01:31 -0400)
Pete Zaitcev reports that with his touchpad, if he lifts the finger
and places it elsewhere, the pointer sometimes warps dramatically.
This happens because we don't store coordinates unless we detect a
touch so sometimes we have stale coordinates in queue (from where
the finger left the pad) and averaging makes cursor to jump across
the screen. The solution is to always store the latest coordinates.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/mousedev.c

index 764970f5da2e471727d07322b009dcda44346c38..3b8011c56c869849c33b993306277eac27ade2ef 100644 (file)
@@ -124,32 +124,33 @@ static void mousedev_touchpad_event(struct input_dev *dev, struct mousedev *mous
        int size, tmp;
        enum { FRACTION_DENOM = 128 };
 
-       if (mousedev->touch) {
-               size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
-               if (size == 0)
-                       size = 256 * 2;
-
-               switch (code) {
-                       case ABS_X:
-                               fx(0) = value;
-                               if (mousedev->pkt_count >= 2) {
-                                       tmp = ((value - fx(2)) * (256 * FRACTION_DENOM)) / size;
-                                       tmp += mousedev->frac_dx;
-                                       mousedev->packet.dx = tmp / FRACTION_DENOM;
-                                       mousedev->frac_dx = tmp - mousedev->packet.dx * FRACTION_DENOM;
-                               }
-                               break;
+       switch (code) {
+               case ABS_X:
+                       fx(0) = value;
+                       if (mousedev->touch && mousedev->pkt_count >= 2) {
+                               size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
+                               if (size == 0)
+                                       size = 256 * 2;
+                               tmp = ((value - fx(2)) * (256 * FRACTION_DENOM)) / size;
+                               tmp += mousedev->frac_dx;
+                               mousedev->packet.dx = tmp / FRACTION_DENOM;
+                               mousedev->frac_dx = tmp - mousedev->packet.dx * FRACTION_DENOM;
+                       }
+                       break;
 
-                       case ABS_Y:
-                               fy(0) = value;
-                               if (mousedev->pkt_count >= 2) {
-                                       tmp = -((value - fy(2)) * (256 * FRACTION_DENOM)) / size;
-                                       tmp += mousedev->frac_dy;
-                                       mousedev->packet.dy = tmp / FRACTION_DENOM;
-                                       mousedev->frac_dy = tmp - mousedev->packet.dy * FRACTION_DENOM;
-                               }
-                               break;
-               }
+               case ABS_Y:
+                       fy(0) = value;
+                       if (mousedev->touch && mousedev->pkt_count >= 2) {
+                               /* use X size to keep the same scale */
+                               size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
+                               if (size == 0)
+                                       size = 256 * 2;
+                               tmp = -((value - fy(2)) * (256 * FRACTION_DENOM)) / size;
+                               tmp += mousedev->frac_dy;
+                               mousedev->packet.dy = tmp / FRACTION_DENOM;
+                               mousedev->frac_dy = tmp - mousedev->packet.dy * FRACTION_DENOM;
+                       }
+                       break;
        }
 }