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 |