summaryrefslogtreecommitdiffstats
path: root/drivers/hid
diff options
context:
space:
mode:
authorChase Douglas <chase.douglas@ubuntu.com>2010-09-02 16:49:52 +0200
committerJiri Kosina <jkosina@suse.cz>2010-09-02 16:49:52 +0200
commit0228db70ce6afdcd14164ab8d18137fa319c76e8 (patch)
treed2549ca73b80654979b072af6f8d80474a64b3f8 /drivers/hid
parent763008c4357b73c8d18396dfd8d79dc58fa3f99d (diff)
downloadlinux-0228db70ce6afdcd14164ab8d18137fa319c76e8.tar.gz
linux-0228db70ce6afdcd14164ab8d18137fa319c76e8.tar.bz2
linux-0228db70ce6afdcd14164ab8d18137fa319c76e8.zip
HID: magicmouse: simplify touch down logic
For the MT protocol, we need to properly keep track of each down touch. This change simplifies the logic, and should make things easier when support for the Magic Trackpad is added. Signed-off-by: Chase Douglas <chase.douglas@canonical.com> Acked-by: Michael Poole <mdpoole@troilus.org> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid')
-rw-r--r--drivers/hid/hid-magicmouse.c27
1 files changed, 9 insertions, 18 deletions
diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c
index 319b0e57ee41..b74abf202e01 100644
--- a/drivers/hid/hid-magicmouse.c
+++ b/drivers/hid/hid-magicmouse.c
@@ -98,7 +98,6 @@ struct magicmouse_sc {
short scroll_x;
short scroll_y;
u8 size;
- u8 down;
} touches[16];
int tracking_ids[16];
};
@@ -226,8 +225,6 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda
if (report_touches && down) {
int orientation = (misc >> 10) - 32;
- msc->touches[id].down = 1;
-
input_report_abs(input, ABS_MT_TRACKING_ID, id);
input_report_abs(input, ABS_MT_TOUCH_MAJOR, tdata[3]);
input_report_abs(input, ABS_MT_TOUCH_MINOR, tdata[4]);
@@ -240,6 +237,9 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda
input_mt_sync(input);
}
+
+ if (down)
+ msc->ntouches++;
}
static int magicmouse_raw_event(struct hid_device *hdev,
@@ -247,7 +247,7 @@ static int magicmouse_raw_event(struct hid_device *hdev,
{
struct magicmouse_sc *msc = hid_get_drvdata(hdev);
struct input_dev *input = msc->input;
- int x, y, ts, ii, clicks, last_up;
+ int x, y, ts, ii, clicks, npoints;
switch (data[0]) {
case 0x10:
@@ -264,22 +264,13 @@ static int magicmouse_raw_event(struct hid_device *hdev,
ts = data[3] >> 6 | data[4] << 2 | data[5] << 10;
msc->delta_time = (ts - msc->last_timestamp) & 0x3ffff;
msc->last_timestamp = ts;
- msc->ntouches = (size - 6) / 8;
- for (ii = 0; ii < msc->ntouches; ii++)
+ npoints = (size - 6) / 8;
+ msc->ntouches = 0;
+ for (ii = 0; ii < npoints; ii++)
magicmouse_emit_touch(msc, ii, data + ii * 8 + 6);
- if (report_touches) {
- last_up = 1;
- for (ii = 0; ii < ARRAY_SIZE(msc->touches); ii++) {
- if (msc->touches[ii].down) {
- last_up = 0;
- msc->touches[ii].down = 0;
- }
- }
- if (last_up) {
- input_mt_sync(input);
- }
- }
+ if (report_touches && msc->ntouches == 0)
+ input_mt_sync(input);
/* When emulating three-button mode, it is important
* to have the current touch information before