aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-magicmouse.c
diff options
context:
space:
mode:
authorChase Douglas <chase.douglas@ubuntu.com>2010-09-02 10:49:52 -0400
committerJiri Kosina <jkosina@suse.cz>2010-09-02 10:49:52 -0400
commit0228db70ce6afdcd14164ab8d18137fa319c76e8 (patch)
treed2549ca73b80654979b072af6f8d80474a64b3f8 /drivers/hid/hid-magicmouse.c
parent763008c4357b73c8d18396dfd8d79dc58fa3f99d (diff)
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/hid-magicmouse.c')
-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 {
98 short scroll_x; 98 short scroll_x;
99 short scroll_y; 99 short scroll_y;
100 u8 size; 100 u8 size;
101 u8 down;
102 } touches[16]; 101 } touches[16];
103 int tracking_ids[16]; 102 int tracking_ids[16];
104}; 103};
@@ -226,8 +225,6 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda
226 if (report_touches && down) { 225 if (report_touches && down) {
227 int orientation = (misc >> 10) - 32; 226 int orientation = (misc >> 10) - 32;
228 227
229 msc->touches[id].down = 1;
230
231 input_report_abs(input, ABS_MT_TRACKING_ID, id); 228 input_report_abs(input, ABS_MT_TRACKING_ID, id);
232 input_report_abs(input, ABS_MT_TOUCH_MAJOR, tdata[3]); 229 input_report_abs(input, ABS_MT_TOUCH_MAJOR, tdata[3]);
233 input_report_abs(input, ABS_MT_TOUCH_MINOR, tdata[4]); 230 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
240 237
241 input_mt_sync(input); 238 input_mt_sync(input);
242 } 239 }
240
241 if (down)
242 msc->ntouches++;
243} 243}
244 244
245static int magicmouse_raw_event(struct hid_device *hdev, 245static int magicmouse_raw_event(struct hid_device *hdev,
@@ -247,7 +247,7 @@ static int magicmouse_raw_event(struct hid_device *hdev,
247{ 247{
248 struct magicmouse_sc *msc = hid_get_drvdata(hdev); 248 struct magicmouse_sc *msc = hid_get_drvdata(hdev);
249 struct input_dev *input = msc->input; 249 struct input_dev *input = msc->input;
250 int x, y, ts, ii, clicks, last_up; 250 int x, y, ts, ii, clicks, npoints;
251 251
252 switch (data[0]) { 252 switch (data[0]) {
253 case 0x10: 253 case 0x10:
@@ -264,22 +264,13 @@ static int magicmouse_raw_event(struct hid_device *hdev,
264 ts = data[3] >> 6 | data[4] << 2 | data[5] << 10; 264 ts = data[3] >> 6 | data[4] << 2 | data[5] << 10;
265 msc->delta_time = (ts - msc->last_timestamp) & 0x3ffff; 265 msc->delta_time = (ts - msc->last_timestamp) & 0x3ffff;
266 msc->last_timestamp = ts; 266 msc->last_timestamp = ts;
267 msc->ntouches = (size - 6) / 8; 267 npoints = (size - 6) / 8;
268 for (ii = 0; ii < msc->ntouches; ii++) 268 msc->ntouches = 0;
269 for (ii = 0; ii < npoints; ii++)
269 magicmouse_emit_touch(msc, ii, data + ii * 8 + 6); 270 magicmouse_emit_touch(msc, ii, data + ii * 8 + 6);
270 271
271 if (report_touches) { 272 if (report_touches && msc->ntouches == 0)
272 last_up = 1; 273 input_mt_sync(input);
273 for (ii = 0; ii < ARRAY_SIZE(msc->touches); ii++) {
274 if (msc->touches[ii].down) {
275 last_up = 0;
276 msc->touches[ii].down = 0;
277 }
278 }
279 if (last_up) {
280 input_mt_sync(input);
281 }
282 }
283 274
284 /* When emulating three-button mode, it is important 275 /* When emulating three-button mode, it is important
285 * to have the current touch information before 276 * to have the current touch information before