diff options
Diffstat (limited to 'drivers/hid/hid-magicmouse.c')
-rw-r--r-- | drivers/hid/hid-magicmouse.c | 27 |
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 | ||
245 | static int magicmouse_raw_event(struct hid_device *hdev, | 245 | static 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 |