OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/events/ozone/evdev/touch_event_converter_evdev.h" | 5 #include "ui/events/ozone/evdev/touch_event_converter_evdev.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <fcntl.h> | 8 #include <fcntl.h> |
9 #include <linux/input.h> | 9 #include <linux/input.h> |
10 #include <poll.h> | 10 #include <poll.h> |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
321 | 321 |
322 void TouchEventConverterEvdev::EmulateMultitouchEvent( | 322 void TouchEventConverterEvdev::EmulateMultitouchEvent( |
323 const input_event& event) { | 323 const input_event& event) { |
324 input_event emulated_event = event; | 324 input_event emulated_event = event; |
325 | 325 |
326 if (event.type == EV_ABS) { | 326 if (event.type == EV_ABS) { |
327 emulated_event.code = AbsCodeToMtCode(event.code); | 327 emulated_event.code = AbsCodeToMtCode(event.code); |
328 if (emulated_event.code >= 0) | 328 if (emulated_event.code >= 0) |
329 ProcessMultitouchEvent(emulated_event); | 329 ProcessMultitouchEvent(emulated_event); |
330 } else if (event.type == EV_KEY) { | 330 } else if (event.type == EV_KEY) { |
331 if (event.code == BTN_TOUCH || | 331 if (event.code == BTN_TOUCH || event.code == BTN_0 || |
332 (quirk_left_mouse_button_ && event.code == BTN_LEFT)) { | 332 (quirk_left_mouse_button_ && event.code == BTN_LEFT)) { |
333 emulated_event.type = EV_ABS; | 333 emulated_event.type = EV_ABS; |
334 emulated_event.code = ABS_MT_TRACKING_ID; | 334 emulated_event.code = ABS_MT_TRACKING_ID; |
335 emulated_event.value = | 335 emulated_event.value = |
336 event.value ? NextTrackingId() : kTrackingIdForUnusedSlot; | 336 event.value ? NextTrackingId() : kTrackingIdForUnusedSlot; |
337 ProcessMultitouchEvent(emulated_event); | 337 ProcessMultitouchEvent(emulated_event); |
338 } | 338 } |
339 } | 339 } |
340 } | 340 } |
341 | 341 |
342 void TouchEventConverterEvdev::ProcessKey(const input_event& input) { | 342 void TouchEventConverterEvdev::ProcessKey(const input_event& input) { |
343 switch (input.code) { | 343 switch (input.code) { |
344 case BTN_TOUCH: | 344 case BTN_TOUCH: |
345 case BTN_LEFT: | 345 case BTN_LEFT: |
346 case BTN_0: | 346 case BTN_0: |
347 events_[current_slot_].btn_left.down = input.value; | 347 events_[current_slot_].btn_left.down = input.value; |
348 events_[current_slot_].btn_left.changed = true; | 348 events_[current_slot_].btn_left.changed = true; |
349 break; | 349 break; |
350 case BTN_STYLUS: | 350 case BTN_STYLUS: |
351 events_[current_slot_].btn_right.down = input.value; | 351 events_[current_slot_].btn_right.down = input.value; |
352 events_[current_slot_].btn_right.changed = true; | 352 events_[current_slot_].btn_right.changed = true; |
353 break; | 353 break; |
354 case BTN_STYLUS2: | 354 case BTN_STYLUS2: |
355 events_[current_slot_].btn_middle.down = input.value; | 355 events_[current_slot_].btn_middle.down = input.value; |
356 events_[current_slot_].btn_middle.changed = true; | 356 events_[current_slot_].btn_middle.changed = true; |
357 break; | 357 break; |
358 case BTN_TOOL_PEN: | 358 case BTN_TOOL_PEN: |
359 case BTN_TOOL_RUBBER: | 359 case BTN_TOOL_RUBBER: |
360 // Do not change tool types while touching to prevent inconsistencies | |
361 // from switching between Mouse and TouchEvents. | |
362 if (events_[current_slot_].was_touching) | |
363 break; | |
364 | |
365 if (input.value > 0) { | 360 if (input.value > 0) { |
366 events_[current_slot_].tool_code = input.code; | 361 events_[current_slot_].tool_code = input.code; |
367 } else { | 362 } else { |
368 events_[current_slot_].tool_code = 0; | 363 events_[current_slot_].tool_code = 0; |
369 } | 364 } |
370 events_[current_slot_].altered = true; | 365 events_[current_slot_].altered = true; |
371 break; | 366 break; |
372 default: | 367 default: |
373 NOTIMPLEMENTED() << "invalid code for EV_KEY: " << input.code; | 368 NOTIMPLEMENTED() << "invalid code for EV_KEY: " << input.code; |
374 } | 369 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
448 | 443 |
449 void TouchEventConverterEvdev::ReportTouchEvent( | 444 void TouchEventConverterEvdev::ReportTouchEvent( |
450 const InProgressTouchEvdev& event, | 445 const InProgressTouchEvdev& event, |
451 EventType event_type, | 446 EventType event_type, |
452 base::TimeTicks timestamp) { | 447 base::TimeTicks timestamp) { |
453 dispatcher_->DispatchTouchEvent(TouchEventParams( | 448 dispatcher_->DispatchTouchEvent(TouchEventParams( |
454 input_device_.id, event.slot, event_type, gfx::PointF(event.x, event.y), | 449 input_device_.id, event.slot, event_type, gfx::PointF(event.x, event.y), |
455 GetEventPointerDetails(event), timestamp)); | 450 GetEventPointerDetails(event), timestamp)); |
456 } | 451 } |
457 | 452 |
458 void TouchEventConverterEvdev::ReportStylusEvent( | |
459 const InProgressTouchEvdev& event, | |
460 base::TimeTicks timestamp) { | |
461 if (event.btn_left.changed) | |
462 ReportButton(BTN_LEFT, event.btn_left.down, event, timestamp); | |
463 if (event.btn_right.changed) | |
464 ReportButton(BTN_RIGHT, event.btn_right.down, event, timestamp); | |
465 if (event.btn_middle.changed) | |
466 ReportButton(BTN_MIDDLE, event.btn_middle.down, event, timestamp); | |
467 | |
468 dispatcher_->DispatchMouseMoveEvent(MouseMoveEventParams( | |
469 input_device_.id, EF_DIRECT_INPUT, gfx::PointF(event.x, event.y), | |
470 GetEventPointerDetails(event), timestamp)); | |
471 } | |
472 | |
473 void TouchEventConverterEvdev::ReportButton(unsigned int button, | 453 void TouchEventConverterEvdev::ReportButton(unsigned int button, |
474 bool down, | 454 bool down, |
475 const InProgressTouchEvdev& event, | 455 const InProgressTouchEvdev& event, |
476 base::TimeTicks timestamp) { | 456 base::TimeTicks timestamp) { |
477 dispatcher_->DispatchMouseButtonEvent(MouseButtonEventParams( | 457 // todo(denniskempin): Report buttons via pointer events |
spang
2016/11/17 18:36:17
All caps - TODO()
| |
478 input_device_.id, EF_DIRECT_INPUT, gfx::PointF(event.x, event.y), button, | |
479 down, false /* allow_remap */, GetEventPointerDetails(event), timestamp)); | |
480 } | 458 } |
481 | 459 |
482 void TouchEventConverterEvdev::ReportEvents(base::TimeTicks timestamp) { | 460 void TouchEventConverterEvdev::ReportEvents(base::TimeTicks timestamp) { |
483 if (dropped_events_) { | 461 if (dropped_events_) { |
484 Reinitialize(); | 462 Reinitialize(); |
485 dropped_events_ = false; | 463 dropped_events_ = false; |
486 } | 464 } |
487 | 465 |
488 if (touch_noise_finder_) | 466 if (touch_noise_finder_) |
489 touch_noise_finder_->HandleTouches(events_, timestamp); | 467 touch_noise_finder_->HandleTouches(events_, timestamp); |
490 | 468 |
491 for (size_t i = 0; i < events_.size(); i++) { | 469 for (size_t i = 0; i < events_.size(); i++) { |
492 InProgressTouchEvdev* event = &events_[i]; | 470 InProgressTouchEvdev* event = &events_[i]; |
493 if (!event->altered) | 471 if (!event->altered) |
494 continue; | 472 continue; |
495 | 473 |
496 if (enable_palm_suppression_callback_) | 474 if (enable_palm_suppression_callback_) |
497 enable_palm_suppression_callback_.Run(event->tool_code > 0); | 475 enable_palm_suppression_callback_.Run(event->tool_code > 0); |
498 | 476 |
499 if (touch_noise_finder_ && touch_noise_finder_->SlotHasNoise(event->slot)) | 477 if (touch_noise_finder_ && touch_noise_finder_->SlotHasNoise(event->slot)) |
500 event->cancelled = true; | 478 event->cancelled = true; |
501 | 479 |
502 if (event->tool_code > 0) { | 480 if (event->btn_left.changed) |
503 ReportStylusEvent(*event, timestamp); | 481 ReportButton(BTN_LEFT, event->btn_left.down, *event, timestamp); |
spang
2016/11/17 18:36:17
This doesn't seem right to me, even considering th
| |
504 } else { | 482 if (event->btn_right.changed) |
505 EventType event_type = GetEventTypeForTouch(*event); | 483 ReportButton(BTN_RIGHT, event->btn_right.down, *event, timestamp); |
506 if (event_type != ET_UNKNOWN) | 484 if (event->btn_middle.changed) |
507 ReportTouchEvent(*event, event_type, timestamp); | 485 ReportButton(BTN_MIDDLE, event->btn_middle.down, *event, timestamp); |
508 } | 486 |
487 EventType event_type = GetEventTypeForTouch(*event); | |
488 if (event_type != ET_UNKNOWN) | |
489 ReportTouchEvent(*event, event_type, timestamp); | |
509 | 490 |
510 event->was_cancelled = event->cancelled; | 491 event->was_cancelled = event->cancelled; |
511 event->was_touching = event->touching; | 492 event->was_touching = event->touching; |
512 event->altered = false; | 493 event->altered = false; |
513 event->btn_left.changed = false; | 494 event->btn_left.changed = false; |
514 event->btn_right.changed = false; | 495 event->btn_right.changed = false; |
515 event->btn_middle.changed = false; | 496 event->btn_middle.changed = false; |
516 } | 497 } |
517 } | 498 } |
518 | 499 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
567 if (pressure_max_ - pressure_min_) | 548 if (pressure_max_ - pressure_min_) |
568 pressure /= pressure_max_ - pressure_min_; | 549 pressure /= pressure_max_ - pressure_min_; |
569 return pressure; | 550 return pressure; |
570 } | 551 } |
571 | 552 |
572 int TouchEventConverterEvdev::NextTrackingId() { | 553 int TouchEventConverterEvdev::NextTrackingId() { |
573 return next_tracking_id_++ & kMaxTrackingId; | 554 return next_tracking_id_++ & kMaxTrackingId; |
574 } | 555 } |
575 | 556 |
576 } // namespace ui | 557 } // namespace ui |
OLD | NEW |