[PATCH] don't interpolate movement on finger-change.

From: Florian Loitsch
Date: Fri May 04 2007 - 18:28:01 EST


---
drivers/usb/input/appletouch.c | 17 ++++++++++-------
1 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/usb/input/appletouch.c b/drivers/usb/input/appletouch.c
index c77291d..7ffe8e7 100644
--- a/drivers/usb/input/appletouch.c
+++ b/drivers/usb/input/appletouch.c
@@ -147,6 +147,7 @@ struct atp {
int valid; /* are the sensors valid ? */
int x_old; /* last reported x/y, */
int y_old; /* used for smoothing */
+ int fingers_old; /* used for smoothing too */
/* current value of the sensors */
signed char xy_cur[ATP_XSENSORS + ATP_YSENSORS];
/* last value of the sensors */
@@ -275,7 +276,7 @@ static inline void atp_report_fingers(struct input_dev
*input, int fingers)

static void atp_complete(struct urb* urb)
{
- int x, y, x_z, y_z, x_f, y_f;
+ int x, y, x_z, y_z, x_f, y_f, fingers;
int retval, i, j;
struct atp *dev = urb->context;

@@ -371,7 +372,7 @@ static void atp_complete(struct urb* urb)
if (!dev->valid) {
/* first sample */
dev->valid = 1;
- dev->x_old = dev->y_old = -1;
+ dev->fingers_old = dev->x_old = dev->y_old = -1;
memcpy(dev->xy_old, dev->xy_cur, sizeof(dev->xy_old));

if (atp_is_geyser_3(dev)) /* No 17" Macbooks (yet) */
@@ -418,12 +419,13 @@ static void atp_complete(struct urb* urb)
y = atp_calculate_abs(dev->xy_acc + ATP_XSENSORS, ATP_YSENSORS,
ATP_YFACT, &y_z, &y_f);

+ fingers = max(x_f, y_f);
if (x && y) {
if (dev->x_old != -1) {
- x = (dev->x_old * 3 + x) >> 2;
- y = (dev->y_old * 3 + y) >> 2;
- dev->x_old = x;
- dev->y_old = y;
+ if (fingers == dev->fingers_old) {
+ x = (dev->x_old * 3 + x) >> 2;
+ y = (dev->y_old * 3 + y) >> 2;
+ }

if (debug > 1)
printk("appletouch: X: %3d Y: %3d "
@@ -435,8 +437,9 @@ static void atp_complete(struct urb* urb)
input_report_abs(dev->input, ABS_Y, y);
input_report_abs(dev->input, ABS_PRESSURE,
min(ATP_PRESSURE, x_z + y_z));
- atp_report_fingers(dev->input, max(x_f, y_f));
+ atp_report_fingers(dev->input, fingers);
}
+ dev->fingers_old = fingers;
dev->x_old = x;
dev->y_old = y;
}
--
1.5.1