Skip to content

Commit

Permalink
HID: magicmouse: simplify touch down logic
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Chase Douglas authored and Jiri Kosina committed Sep 2, 2010
1 parent 763008c commit 0228db7
Showing 1 changed file with 9 additions and 18 deletions.
27 changes: 9 additions & 18 deletions drivers/hid/hid-magicmouse.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,6 @@ struct magicmouse_sc {
short scroll_x;
short scroll_y;
u8 size;
u8 down;
} touches[16];
int tracking_ids[16];
};
Expand Down Expand Up @@ -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]);
Expand All @@ -240,14 +237,17 @@ 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,
struct hid_report *report, u8 *data, int size)
{
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:
Expand All @@ -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
Expand Down

0 comments on commit 0228db7

Please sign in to comment.