Chromium Code Reviews| 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 |