| 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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 return ABS_MT_POSITION_Y; | 71 return ABS_MT_POSITION_Y; |
| 72 case ABS_PRESSURE: | 72 case ABS_PRESSURE: |
| 73 return ABS_MT_PRESSURE; | 73 return ABS_MT_PRESSURE; |
| 74 case ABS_DISTANCE: | 74 case ABS_DISTANCE: |
| 75 return ABS_MT_DISTANCE; | 75 return ABS_MT_DISTANCE; |
| 76 default: | 76 default: |
| 77 return -1; | 77 return -1; |
| 78 } | 78 } |
| 79 } | 79 } |
| 80 | 80 |
| 81 ui::PointerDetails GetEventPointerDetails( | 81 ui::EventPointerType GetEventPointerType(int tool_code) { |
| 82 const ui::InProgressTouchEvdev& event) { | 82 switch (tool_code) { |
| 83 ui::EventPointerType type; | |
| 84 switch (event.tool_code) { | |
| 85 case BTN_TOOL_PEN: | 83 case BTN_TOOL_PEN: |
| 86 type = ui::EventPointerType::POINTER_TYPE_PEN; | 84 return ui::EventPointerType::POINTER_TYPE_PEN; |
| 87 break; | |
| 88 case BTN_TOOL_RUBBER: | 85 case BTN_TOOL_RUBBER: |
| 89 type = ui::EventPointerType::POINTER_TYPE_ERASER; | 86 return ui::EventPointerType::POINTER_TYPE_ERASER; |
| 90 break; | |
| 91 default: | 87 default: |
| 92 type = ui::EventPointerType::POINTER_TYPE_TOUCH; | 88 return ui::EventPointerType::POINTER_TYPE_TOUCH; |
| 93 } | 89 } |
| 94 return ui::PointerDetails(type, event.radius_x, event.radius_y, | |
| 95 event.pressure, | |
| 96 /* tilt_x */ 0.0f, | |
| 97 /* tilt_y */ 0.0f); | |
| 98 } | 90 } |
| 99 | 91 |
| 100 const int kTrackingIdForUnusedSlot = -1; | 92 const int kTrackingIdForUnusedSlot = -1; |
| 101 | 93 |
| 102 } // namespace | 94 } // namespace |
| 103 | 95 |
| 104 namespace ui { | 96 namespace ui { |
| 105 | 97 |
| 106 TouchEventConverterEvdev::TouchEventConverterEvdev( | 98 TouchEventConverterEvdev::TouchEventConverterEvdev( |
| 107 int fd, | 99 int fd, |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 | 313 |
| 322 void TouchEventConverterEvdev::EmulateMultitouchEvent( | 314 void TouchEventConverterEvdev::EmulateMultitouchEvent( |
| 323 const input_event& event) { | 315 const input_event& event) { |
| 324 input_event emulated_event = event; | 316 input_event emulated_event = event; |
| 325 | 317 |
| 326 if (event.type == EV_ABS) { | 318 if (event.type == EV_ABS) { |
| 327 emulated_event.code = AbsCodeToMtCode(event.code); | 319 emulated_event.code = AbsCodeToMtCode(event.code); |
| 328 if (emulated_event.code >= 0) | 320 if (emulated_event.code >= 0) |
| 329 ProcessMultitouchEvent(emulated_event); | 321 ProcessMultitouchEvent(emulated_event); |
| 330 } else if (event.type == EV_KEY) { | 322 } else if (event.type == EV_KEY) { |
| 331 if (event.code == BTN_TOUCH || | 323 if (event.code == BTN_TOUCH || event.code == BTN_0 || |
| 332 (quirk_left_mouse_button_ && event.code == BTN_LEFT)) { | 324 (quirk_left_mouse_button_ && event.code == BTN_LEFT)) { |
| 333 emulated_event.type = EV_ABS; | 325 emulated_event.type = EV_ABS; |
| 334 emulated_event.code = ABS_MT_TRACKING_ID; | 326 emulated_event.code = ABS_MT_TRACKING_ID; |
| 335 emulated_event.value = | 327 emulated_event.value = |
| 336 event.value ? NextTrackingId() : kTrackingIdForUnusedSlot; | 328 event.value ? NextTrackingId() : kTrackingIdForUnusedSlot; |
| 337 ProcessMultitouchEvent(emulated_event); | 329 ProcessMultitouchEvent(emulated_event); |
| 338 } | 330 } |
| 339 } | 331 } |
| 340 } | 332 } |
| 341 | 333 |
| 342 void TouchEventConverterEvdev::ProcessKey(const input_event& input) { | 334 void TouchEventConverterEvdev::ProcessKey(const input_event& input) { |
| 343 switch (input.code) { | 335 switch (input.code) { |
| 344 case BTN_TOUCH: | 336 case BTN_TOUCH: |
| 345 case BTN_LEFT: | 337 case BTN_LEFT: |
| 346 case BTN_0: | 338 case BTN_0: |
| 347 events_[current_slot_].btn_left.down = input.value; | 339 events_[current_slot_].btn_left.down = input.value; |
| 348 events_[current_slot_].btn_left.changed = true; | 340 events_[current_slot_].btn_left.changed = true; |
| 349 break; | 341 break; |
| 350 case BTN_STYLUS: | 342 case BTN_STYLUS: |
| 351 events_[current_slot_].btn_right.down = input.value; | 343 events_[current_slot_].btn_right.down = input.value; |
| 352 events_[current_slot_].btn_right.changed = true; | 344 events_[current_slot_].btn_right.changed = true; |
| 353 break; | 345 break; |
| 354 case BTN_STYLUS2: | 346 case BTN_STYLUS2: |
| 355 events_[current_slot_].btn_middle.down = input.value; | 347 events_[current_slot_].btn_middle.down = input.value; |
| 356 events_[current_slot_].btn_middle.changed = true; | 348 events_[current_slot_].btn_middle.changed = true; |
| 357 break; | 349 break; |
| 358 case BTN_TOOL_PEN: | 350 case BTN_TOOL_PEN: |
| 359 case BTN_TOOL_RUBBER: | 351 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) { | 352 if (input.value > 0) { |
| 366 events_[current_slot_].tool_code = input.code; | 353 events_[current_slot_].tool_code = input.code; |
| 367 } else { | 354 } else { |
| 368 events_[current_slot_].tool_code = 0; | 355 events_[current_slot_].tool_code = 0; |
| 369 } | 356 } |
| 370 events_[current_slot_].altered = true; | 357 events_[current_slot_].altered = true; |
| 371 break; | 358 break; |
| 372 default: | 359 default: |
| 373 NOTIMPLEMENTED() << "invalid code for EV_KEY: " << input.code; | 360 NOTIMPLEMENTED() << "invalid code for EV_KEY: " << input.code; |
| 374 } | 361 } |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 | 430 |
| 444 if (touch.touching) | 431 if (touch.touching) |
| 445 return touch.was_touching ? ET_TOUCH_MOVED : ET_TOUCH_PRESSED; | 432 return touch.was_touching ? ET_TOUCH_MOVED : ET_TOUCH_PRESSED; |
| 446 return touch.was_touching ? ET_TOUCH_RELEASED : ET_UNKNOWN; | 433 return touch.was_touching ? ET_TOUCH_RELEASED : ET_UNKNOWN; |
| 447 } | 434 } |
| 448 | 435 |
| 449 void TouchEventConverterEvdev::ReportTouchEvent( | 436 void TouchEventConverterEvdev::ReportTouchEvent( |
| 450 const InProgressTouchEvdev& event, | 437 const InProgressTouchEvdev& event, |
| 451 EventType event_type, | 438 EventType event_type, |
| 452 base::TimeTicks timestamp) { | 439 base::TimeTicks timestamp) { |
| 453 dispatcher_->DispatchTouchEvent(TouchEventParams( | 440 ui::PointerDetails details(event.reported_tool_type, event.radius_x, |
| 454 input_device_.id, event.slot, event_type, gfx::PointF(event.x, event.y), | 441 event.radius_y, event.pressure, |
| 455 GetEventPointerDetails(event), timestamp)); | 442 /* tilt_x */ 0.0f, /* tilt_y */ 0.0f); |
| 456 } | 443 dispatcher_->DispatchTouchEvent( |
| 457 | 444 TouchEventParams(input_device_.id, event.slot, event_type, |
| 458 void TouchEventConverterEvdev::ReportStylusEvent( | 445 gfx::PointF(event.x, event.y), details, timestamp)); |
| 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, | |
| 474 bool down, | |
| 475 const InProgressTouchEvdev& event, | |
| 476 base::TimeTicks timestamp) { | |
| 477 dispatcher_->DispatchMouseButtonEvent(MouseButtonEventParams( | |
| 478 input_device_.id, EF_DIRECT_INPUT, gfx::PointF(event.x, event.y), button, | |
| 479 down, false /* allow_remap */, GetEventPointerDetails(event), timestamp)); | |
| 480 } | 446 } |
| 481 | 447 |
| 482 void TouchEventConverterEvdev::ReportEvents(base::TimeTicks timestamp) { | 448 void TouchEventConverterEvdev::ReportEvents(base::TimeTicks timestamp) { |
| 483 if (dropped_events_) { | 449 if (dropped_events_) { |
| 484 Reinitialize(); | 450 Reinitialize(); |
| 485 dropped_events_ = false; | 451 dropped_events_ = false; |
| 486 } | 452 } |
| 487 | 453 |
| 488 if (touch_noise_finder_) | 454 if (touch_noise_finder_) |
| 489 touch_noise_finder_->HandleTouches(events_, timestamp); | 455 touch_noise_finder_->HandleTouches(events_, timestamp); |
| 490 | 456 |
| 491 for (size_t i = 0; i < events_.size(); i++) { | 457 for (size_t i = 0; i < events_.size(); i++) { |
| 492 InProgressTouchEvdev* event = &events_[i]; | 458 InProgressTouchEvdev* event = &events_[i]; |
| 493 if (!event->altered) | 459 if (!event->altered) |
| 494 continue; | 460 continue; |
| 495 | 461 |
| 496 if (enable_palm_suppression_callback_) | 462 if (enable_palm_suppression_callback_) |
| 497 enable_palm_suppression_callback_.Run(event->tool_code > 0); | 463 enable_palm_suppression_callback_.Run(event->tool_code > 0); |
| 498 | 464 |
| 499 if (touch_noise_finder_ && touch_noise_finder_->SlotHasNoise(event->slot)) | 465 if (touch_noise_finder_ && touch_noise_finder_->SlotHasNoise(event->slot)) |
| 500 event->cancelled = true; | 466 event->cancelled = true; |
| 501 | 467 |
| 502 if (event->tool_code > 0) { | 468 EventType event_type = GetEventTypeForTouch(*event); |
| 503 ReportStylusEvent(*event, timestamp); | 469 // The tool type is fixed with the touch pressed event and does not change. |
| 504 } else { | 470 if (event_type == ET_TOUCH_PRESSED) |
| 505 EventType event_type = GetEventTypeForTouch(*event); | 471 event->reported_tool_type = GetEventPointerType(event->tool_code); |
| 506 if (event_type != ET_UNKNOWN) | 472 if (event_type != ET_UNKNOWN) |
| 507 ReportTouchEvent(*event, event_type, timestamp); | 473 ReportTouchEvent(*event, event_type, timestamp); |
| 508 } | |
| 509 | 474 |
| 510 event->was_cancelled = event->cancelled; | 475 event->was_cancelled = event->cancelled; |
| 511 event->was_touching = event->touching; | 476 event->was_touching = event->touching; |
| 512 event->altered = false; | 477 event->altered = false; |
| 513 event->btn_left.changed = false; | 478 event->btn_left.changed = false; |
| 514 event->btn_right.changed = false; | 479 event->btn_right.changed = false; |
| 515 event->btn_middle.changed = false; | 480 event->btn_middle.changed = false; |
| 516 } | 481 } |
| 517 } | 482 } |
| 518 | 483 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 567 if (pressure_max_ - pressure_min_) | 532 if (pressure_max_ - pressure_min_) |
| 568 pressure /= pressure_max_ - pressure_min_; | 533 pressure /= pressure_max_ - pressure_min_; |
| 569 return pressure; | 534 return pressure; |
| 570 } | 535 } |
| 571 | 536 |
| 572 int TouchEventConverterEvdev::NextTrackingId() { | 537 int TouchEventConverterEvdev::NextTrackingId() { |
| 573 return next_tracking_id_++ & kMaxTrackingId; | 538 return next_tracking_id_++ & kMaxTrackingId; |
| 574 } | 539 } |
| 575 | 540 |
| 576 } // namespace ui | 541 } // namespace ui |
| OLD | NEW |