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/chromeos/touch_exploration_controller.h" | 5 #include "ui/chromeos/touch_exploration_controller.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 | 123 |
124 if (passthrough_timer_.IsRunning() && | 124 if (passthrough_timer_.IsRunning() && |
125 event.time_stamp() - initial_press_->time_stamp() > | 125 event.time_stamp() - initial_press_->time_stamp() > |
126 gesture_detector_config_.longpress_timeout) { | 126 gesture_detector_config_.longpress_timeout) { |
127 passthrough_timer_.Stop(); | 127 passthrough_timer_.Stop(); |
128 OnPassthroughTimerFired(); | 128 OnPassthroughTimerFired(); |
129 } | 129 } |
130 | 130 |
131 const ui::EventType type = touch_event.type(); | 131 const ui::EventType type = touch_event.type(); |
132 const gfx::PointF& location = touch_event.location_f(); | 132 const gfx::PointF& location = touch_event.location_f(); |
133 const int touch_id = touch_event.touch_id(); | 133 const int touch_id = touch_event.pointer_details().id; |
134 | 134 |
135 // Always update touch ids and touch locations, so we can use those | 135 // Always update touch ids and touch locations, so we can use those |
136 // no matter what state we're in. | 136 // no matter what state we're in. |
137 if (type == ui::ET_TOUCH_PRESSED) { | 137 if (type == ui::ET_TOUCH_PRESSED) { |
138 current_touch_ids_.push_back(touch_id); | 138 current_touch_ids_.push_back(touch_id); |
139 touch_locations_.insert(std::pair<int, gfx::PointF>(touch_id, location)); | 139 touch_locations_.insert(std::pair<int, gfx::PointF>(touch_id, location)); |
140 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { | 140 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { |
141 std::vector<int>::iterator it = std::find( | 141 std::vector<int>::iterator it = std::find( |
142 current_touch_ids_.begin(), current_touch_ids_.end(), touch_id); | 142 current_touch_ids_.begin(), current_touch_ids_.end(), touch_id); |
143 | 143 |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 bool in_a_bottom_corner = | 276 bool in_a_bottom_corner = |
277 (BOTTOM_LEFT_CORNER == location) || (BOTTOM_RIGHT_CORNER == location); | 277 (BOTTOM_LEFT_CORNER == location) || (BOTTOM_RIGHT_CORNER == location); |
278 if (in_a_bottom_corner) { | 278 if (in_a_bottom_corner) { |
279 passthrough_timer_.Start( | 279 passthrough_timer_.Start( |
280 FROM_HERE, | 280 FROM_HERE, |
281 gesture_detector_config_.longpress_timeout, | 281 gesture_detector_config_.longpress_timeout, |
282 this, | 282 this, |
283 &TouchExplorationController::OnPassthroughTimerFired); | 283 &TouchExplorationController::OnPassthroughTimerFired); |
284 } | 284 } |
285 initial_press_.reset(new TouchEvent(event)); | 285 initial_press_.reset(new TouchEvent(event)); |
286 initial_presses_[event.touch_id()] = event.location(); | 286 initial_presses_[event.pointer_details().id] = event.location(); |
287 last_unused_finger_event_.reset(new TouchEvent(event)); | 287 last_unused_finger_event_.reset(new TouchEvent(event)); |
288 StartTapTimer(); | 288 StartTapTimer(); |
289 SET_STATE(SINGLE_TAP_PRESSED); | 289 SET_STATE(SINGLE_TAP_PRESSED); |
290 return ui::EVENT_REWRITE_DISCARD; | 290 return ui::EVENT_REWRITE_DISCARD; |
291 } | 291 } |
292 | 292 |
293 ui::EventRewriteStatus TouchExplorationController::InSingleTapPressed( | 293 ui::EventRewriteStatus TouchExplorationController::InSingleTapPressed( |
294 const ui::TouchEvent& event, | 294 const ui::TouchEvent& event, |
295 std::unique_ptr<ui::Event>* rewritten_event) { | 295 std::unique_ptr<ui::Event>* rewritten_event) { |
296 const ui::EventType type = event.type(); | 296 const ui::EventType type = event.type(); |
297 | 297 |
298 int location = FindEdgesWithinBounds(event.location(), kMaxDistanceFromEdge); | 298 int location = FindEdgesWithinBounds(event.location(), kMaxDistanceFromEdge); |
299 bool in_a_bottom_corner = | 299 bool in_a_bottom_corner = |
300 (location == BOTTOM_LEFT_CORNER) || (location == BOTTOM_RIGHT_CORNER); | 300 (location == BOTTOM_LEFT_CORNER) || (location == BOTTOM_RIGHT_CORNER); |
301 // If the event is from the initial press and the location is no longer in the | 301 // If the event is from the initial press and the location is no longer in the |
302 // corner, then we are not waiting for a corner passthrough anymore. | 302 // corner, then we are not waiting for a corner passthrough anymore. |
303 if (event.touch_id() == initial_press_->touch_id() && !in_a_bottom_corner) { | 303 if (event.pointer_details().id == initial_press_->pointer_details().id && |
| 304 !in_a_bottom_corner) { |
304 if (passthrough_timer_.IsRunning()) { | 305 if (passthrough_timer_.IsRunning()) { |
305 passthrough_timer_.Stop(); | 306 passthrough_timer_.Stop(); |
306 // Since the long press timer has been running, it is possible that the | 307 // Since the long press timer has been running, it is possible that the |
307 // tap timer has timed out before the long press timer has. If the tap | 308 // tap timer has timed out before the long press timer has. If the tap |
308 // timer timeout has elapsed, then fire the tap timer. | 309 // timer timeout has elapsed, then fire the tap timer. |
309 if (event.time_stamp() - initial_press_->time_stamp() > | 310 if (event.time_stamp() - initial_press_->time_stamp() > |
310 gesture_detector_config_.double_tap_timeout) { | 311 gesture_detector_config_.double_tap_timeout) { |
311 OnTapTimerFired(); | 312 OnTapTimerFired(); |
312 } | 313 } |
313 } | 314 } |
314 } | 315 } |
315 | 316 |
316 if (type == ui::ET_TOUCH_PRESSED) { | 317 if (type == ui::ET_TOUCH_PRESSED) { |
317 initial_presses_[event.touch_id()] = event.location(); | 318 initial_presses_[event.pointer_details().id] = event.location(); |
318 SET_STATE(TWO_FINGER_TAP); | 319 SET_STATE(TWO_FINGER_TAP); |
319 return EVENT_REWRITE_DISCARD; | 320 return EVENT_REWRITE_DISCARD; |
320 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { | 321 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { |
321 if (passthrough_timer_.IsRunning()) | 322 if (passthrough_timer_.IsRunning()) |
322 passthrough_timer_.Stop(); | 323 passthrough_timer_.Stop(); |
323 if (current_touch_ids_.size() == 0 && | 324 if (current_touch_ids_.size() == 0 && |
324 event.touch_id() == initial_press_->touch_id()) { | 325 event.pointer_details().id == initial_press_->pointer_details().id) { |
325 SET_STATE(SINGLE_TAP_RELEASED); | 326 SET_STATE(SINGLE_TAP_RELEASED); |
326 } else if (current_touch_ids_.size() == 0) { | 327 } else if (current_touch_ids_.size() == 0) { |
327 SET_STATE(NO_FINGERS_DOWN); | 328 SET_STATE(NO_FINGERS_DOWN); |
328 } | 329 } |
329 return EVENT_REWRITE_DISCARD; | 330 return EVENT_REWRITE_DISCARD; |
330 } else if (type == ui::ET_TOUCH_MOVED) { | 331 } else if (type == ui::ET_TOUCH_MOVED) { |
331 float distance = (event.location() - initial_press_->location()).Length(); | 332 float distance = (event.location() - initial_press_->location()).Length(); |
332 // If the user does not move far enough from the original position, then the | 333 // If the user does not move far enough from the original position, then the |
333 // resulting movement should not be considered to be a deliberate gesture or | 334 // resulting movement should not be considered to be a deliberate gesture or |
334 // touch exploration. | 335 // touch exploration. |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 } | 500 } |
500 return ui::EVENT_REWRITE_DISCARD; | 501 return ui::EVENT_REWRITE_DISCARD; |
501 } | 502 } |
502 | 503 |
503 ui::EventRewriteStatus TouchExplorationController::InCornerPassthrough( | 504 ui::EventRewriteStatus TouchExplorationController::InCornerPassthrough( |
504 const ui::TouchEvent& event, | 505 const ui::TouchEvent& event, |
505 std::unique_ptr<ui::Event>* rewritten_event) { | 506 std::unique_ptr<ui::Event>* rewritten_event) { |
506 ui::EventType type = event.type(); | 507 ui::EventType type = event.type(); |
507 | 508 |
508 // If the first finger has left the corner, then exit passthrough. | 509 // If the first finger has left the corner, then exit passthrough. |
509 if (event.touch_id() == initial_press_->touch_id()) { | 510 if (event.pointer_details().id == initial_press_->pointer_details().id) { |
510 int edges = FindEdgesWithinBounds(event.location(), kSlopDistanceFromEdge); | 511 int edges = FindEdgesWithinBounds(event.location(), kSlopDistanceFromEdge); |
511 bool in_a_bottom_corner = (edges == BOTTOM_LEFT_CORNER) || | 512 bool in_a_bottom_corner = (edges == BOTTOM_LEFT_CORNER) || |
512 (edges == BOTTOM_RIGHT_CORNER); | 513 (edges == BOTTOM_RIGHT_CORNER); |
513 if (type == ui::ET_TOUCH_MOVED && in_a_bottom_corner) | 514 if (type == ui::ET_TOUCH_MOVED && in_a_bottom_corner) |
514 return ui::EVENT_REWRITE_DISCARD; | 515 return ui::EVENT_REWRITE_DISCARD; |
515 | 516 |
516 if (current_touch_ids_.size() == 0) { | 517 if (current_touch_ids_.size() == 0) { |
517 SET_STATE(NO_FINGERS_DOWN); | 518 SET_STATE(NO_FINGERS_DOWN); |
518 return ui::EVENT_REWRITE_DISCARD; | 519 return ui::EVENT_REWRITE_DISCARD; |
519 } | 520 } |
520 SET_STATE(WAIT_FOR_NO_FINGERS); | 521 SET_STATE(WAIT_FOR_NO_FINGERS); |
521 return ui::EVENT_REWRITE_DISCARD; | 522 return ui::EVENT_REWRITE_DISCARD; |
522 } | 523 } |
523 | 524 |
524 std::unique_ptr<ui::TouchEvent> new_event(new ui::TouchEvent( | 525 std::unique_ptr<ui::TouchEvent> new_event(new ui::TouchEvent( |
525 type, gfx::Point(), event.touch_id(), event.time_stamp())); | 526 type, gfx::Point(), event.pointer_details().id, event.time_stamp())); |
526 new_event->set_location_f(event.location_f()); | 527 new_event->set_location_f(event.location_f()); |
527 new_event->set_root_location_f(event.location_f()); | 528 new_event->set_root_location_f(event.location_f()); |
528 new_event->set_flags(event.flags()); | 529 new_event->set_flags(event.flags()); |
529 *rewritten_event = std::move(new_event); | 530 *rewritten_event = std::move(new_event); |
530 | 531 |
531 if (current_touch_ids_.size() == 0) | 532 if (current_touch_ids_.size() == 0) |
532 SET_STATE(NO_FINGERS_DOWN); | 533 SET_STATE(NO_FINGERS_DOWN); |
533 | 534 |
534 return ui::EVENT_REWRITE_REWRITTEN; | 535 return ui::EVENT_REWRITE_REWRITTEN; |
535 } | 536 } |
536 | 537 |
537 ui::EventRewriteStatus TouchExplorationController::InOneFingerPassthrough( | 538 ui::EventRewriteStatus TouchExplorationController::InOneFingerPassthrough( |
538 const ui::TouchEvent& event, | 539 const ui::TouchEvent& event, |
539 std::unique_ptr<ui::Event>* rewritten_event) { | 540 std::unique_ptr<ui::Event>* rewritten_event) { |
540 if (event.touch_id() != initial_press_->touch_id()) { | 541 if (event.pointer_details().id != initial_press_->pointer_details().id) { |
541 if (current_touch_ids_.size() == 0) { | 542 if (current_touch_ids_.size() == 0) { |
542 SET_STATE(NO_FINGERS_DOWN); | 543 SET_STATE(NO_FINGERS_DOWN); |
543 } | 544 } |
544 return ui::EVENT_REWRITE_DISCARD; | 545 return ui::EVENT_REWRITE_DISCARD; |
545 } | 546 } |
546 std::unique_ptr<ui::TouchEvent> new_event(new ui::TouchEvent( | 547 std::unique_ptr<ui::TouchEvent> new_event( |
547 event.type(), gfx::Point(), event.touch_id(), event.time_stamp())); | 548 new ui::TouchEvent(event.type(), gfx::Point(), event.pointer_details().id, |
| 549 event.time_stamp())); |
548 new_event->set_location_f(event.location_f() - passthrough_offset_); | 550 new_event->set_location_f(event.location_f() - passthrough_offset_); |
549 new_event->set_root_location_f(event.location_f() - passthrough_offset_); | 551 new_event->set_root_location_f(event.location_f() - passthrough_offset_); |
550 new_event->set_flags(event.flags()); | 552 new_event->set_flags(event.flags()); |
551 *rewritten_event = std::move(new_event); | 553 *rewritten_event = std::move(new_event); |
552 if (current_touch_ids_.size() == 0) { | 554 if (current_touch_ids_.size() == 0) { |
553 SET_STATE(NO_FINGERS_DOWN); | 555 SET_STATE(NO_FINGERS_DOWN); |
554 } | 556 } |
555 return ui::EVENT_REWRITE_REWRITTEN; | 557 return ui::EVENT_REWRITE_REWRITTEN; |
556 } | 558 } |
557 | 559 |
558 ui::EventRewriteStatus TouchExplorationController::InTouchExploreSecondPress( | 560 ui::EventRewriteStatus TouchExplorationController::InTouchExploreSecondPress( |
559 const ui::TouchEvent& event, | 561 const ui::TouchEvent& event, |
560 std::unique_ptr<ui::Event>* rewritten_event) { | 562 std::unique_ptr<ui::Event>* rewritten_event) { |
561 ui::EventType type = event.type(); | 563 ui::EventType type = event.type(); |
562 if (type == ui::ET_TOUCH_PRESSED) { | 564 if (type == ui::ET_TOUCH_PRESSED) { |
563 // A third finger being pressed means that a split tap can no longer go | 565 // A third finger being pressed means that a split tap can no longer go |
564 // through. The user enters the wait state, Since there has already been | 566 // through. The user enters the wait state, Since there has already been |
565 // a press dispatched when split tap began, the touch needs to be | 567 // a press dispatched when split tap began, the touch needs to be |
566 // cancelled. | 568 // cancelled. |
567 std::unique_ptr<ui::TouchEvent> new_event( | 569 std::unique_ptr<ui::TouchEvent> new_event(new ui::TouchEvent( |
568 new ui::TouchEvent(ui::ET_TOUCH_CANCELLED, gfx::Point(), | 570 ui::ET_TOUCH_CANCELLED, gfx::Point(), |
569 initial_press_->touch_id(), event.time_stamp())); | 571 initial_press_->pointer_details().id, event.time_stamp())); |
570 // TODO(dmazzoni): fix for multiple displays. http://crbug.com/616793 | 572 // TODO(dmazzoni): fix for multiple displays. http://crbug.com/616793 |
571 new_event->set_location_f(anchor_point_); | 573 new_event->set_location_f(anchor_point_); |
572 new_event->set_root_location_f(anchor_point_); | 574 new_event->set_root_location_f(anchor_point_); |
573 new_event->set_flags(event.flags()); | 575 new_event->set_flags(event.flags()); |
574 *rewritten_event = std::move(new_event); | 576 *rewritten_event = std::move(new_event); |
575 SET_STATE(WAIT_FOR_NO_FINGERS); | 577 SET_STATE(WAIT_FOR_NO_FINGERS); |
576 return ui::EVENT_REWRITE_REWRITTEN; | 578 return ui::EVENT_REWRITE_REWRITTEN; |
577 } else if (type == ui::ET_TOUCH_MOVED) { | 579 } else if (type == ui::ET_TOUCH_MOVED) { |
578 // If the fingers have moved too far from their original locations, | 580 // If the fingers have moved too far from their original locations, |
579 // the user can no longer split tap. | 581 // the user can no longer split tap. |
580 ui::TouchEvent* original_touch; | 582 ui::TouchEvent* original_touch; |
581 if (event.touch_id() == last_touch_exploration_->touch_id()) { | 583 if (event.pointer_details().id == |
| 584 last_touch_exploration_->pointer_details().id) { |
582 original_touch = last_touch_exploration_.get(); | 585 original_touch = last_touch_exploration_.get(); |
583 } else if (event.touch_id() == initial_press_->touch_id()) { | 586 } else if (event.pointer_details().id == |
| 587 initial_press_->pointer_details().id) { |
584 original_touch = initial_press_.get(); | 588 original_touch = initial_press_.get(); |
585 } else { | 589 } else { |
586 NOTREACHED(); | 590 NOTREACHED(); |
587 SET_STATE(WAIT_FOR_NO_FINGERS); | 591 SET_STATE(WAIT_FOR_NO_FINGERS); |
588 return ui::EVENT_REWRITE_DISCARD; | 592 return ui::EVENT_REWRITE_DISCARD; |
589 } | 593 } |
590 // Check the distance between the current finger location and the original | 594 // Check the distance between the current finger location and the original |
591 // location. The slop for this is a bit more generous since keeping two | 595 // location. The slop for this is a bit more generous since keeping two |
592 // fingers in place is a bit harder. If the user has left the slop, the | 596 // fingers in place is a bit harder. If the user has left the slop, the |
593 // user enters the wait state. | 597 // user enters the wait state. |
594 if ((event.location_f() - original_touch->location_f()).Length() > | 598 if ((event.location_f() - original_touch->location_f()).Length() > |
595 GetSplitTapTouchSlop()) { | 599 GetSplitTapTouchSlop()) { |
596 SET_STATE(WAIT_FOR_NO_FINGERS); | 600 SET_STATE(WAIT_FOR_NO_FINGERS); |
597 } | 601 } |
598 return ui::EVENT_REWRITE_DISCARD; | 602 return ui::EVENT_REWRITE_DISCARD; |
599 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { | 603 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { |
600 // If the touch exploration finger is lifted, there is no option to return | 604 // If the touch exploration finger is lifted, there is no option to return |
601 // to touch explore anymore. The remaining finger acts as a pending | 605 // to touch explore anymore. The remaining finger acts as a pending |
602 // tap or long tap for the last touch explore location. | 606 // tap or long tap for the last touch explore location. |
603 if (event.touch_id() == last_touch_exploration_->touch_id()) { | 607 if (event.pointer_details().id == |
| 608 last_touch_exploration_->pointer_details().id) { |
604 SET_STATE(TOUCH_RELEASE_PENDING); | 609 SET_STATE(TOUCH_RELEASE_PENDING); |
605 return EVENT_REWRITE_DISCARD; | 610 return EVENT_REWRITE_DISCARD; |
606 } | 611 } |
607 | 612 |
608 // Continue to release the touch only if the touch explore finger is the | 613 // Continue to release the touch only if the touch explore finger is the |
609 // only finger remaining. | 614 // only finger remaining. |
610 if (current_touch_ids_.size() != 1) | 615 if (current_touch_ids_.size() != 1) |
611 return EVENT_REWRITE_DISCARD; | 616 return EVENT_REWRITE_DISCARD; |
612 | 617 |
613 SendSimulatedClick(); | 618 SendSimulatedClick(); |
(...skipping 26 matching lines...) Expand all Loading... |
640 return; | 645 return; |
641 } | 646 } |
642 | 647 |
643 // If we don't have an anchor point, we can't send a simulated click. | 648 // If we don't have an anchor point, we can't send a simulated click. |
644 if (anchor_point_state_ == ANCHOR_POINT_NONE) | 649 if (anchor_point_state_ == ANCHOR_POINT_NONE) |
645 return; | 650 return; |
646 | 651 |
647 // Otherwise send a simulated press/release at the anchor point. | 652 // Otherwise send a simulated press/release at the anchor point. |
648 std::unique_ptr<ui::TouchEvent> touch_press; | 653 std::unique_ptr<ui::TouchEvent> touch_press; |
649 touch_press.reset(new ui::TouchEvent(ui::ET_TOUCH_PRESSED, gfx::Point(), | 654 touch_press.reset(new ui::TouchEvent(ui::ET_TOUCH_PRESSED, gfx::Point(), |
650 initial_press_->touch_id(), Now())); | 655 initial_press_->pointer_details().id, |
| 656 Now())); |
651 touch_press->set_location_f(anchor_point_); | 657 touch_press->set_location_f(anchor_point_); |
652 touch_press->set_root_location_f(anchor_point_); | 658 touch_press->set_root_location_f(anchor_point_); |
653 DispatchEvent(touch_press.get()); | 659 DispatchEvent(touch_press.get()); |
654 | 660 |
655 std::unique_ptr<ui::TouchEvent> touch_release; | 661 std::unique_ptr<ui::TouchEvent> touch_release; |
656 touch_release.reset(new ui::TouchEvent(ui::ET_TOUCH_RELEASED, gfx::Point(), | 662 touch_release.reset(new ui::TouchEvent(ui::ET_TOUCH_RELEASED, gfx::Point(), |
657 initial_press_->touch_id(), Now())); | 663 initial_press_->pointer_details().id, |
| 664 Now())); |
658 touch_release->set_location_f(anchor_point_); | 665 touch_release->set_location_f(anchor_point_); |
659 touch_release->set_root_location_f(anchor_point_); | 666 touch_release->set_root_location_f(anchor_point_); |
660 DispatchEvent(touch_release.get()); | 667 DispatchEvent(touch_release.get()); |
661 } | 668 } |
662 | 669 |
663 ui::EventRewriteStatus TouchExplorationController::InSlideGesture( | 670 ui::EventRewriteStatus TouchExplorationController::InSlideGesture( |
664 const ui::TouchEvent& event, | 671 const ui::TouchEvent& event, |
665 std::unique_ptr<ui::Event>* rewritten_event) { | 672 std::unique_ptr<ui::Event>* rewritten_event) { |
666 // The timer should not fire when sliding. | 673 // The timer should not fire when sliding. |
667 tap_timer_.Stop(); | 674 tap_timer_.Stop(); |
668 | 675 |
669 ui::EventType type = event.type(); | 676 ui::EventType type = event.type(); |
670 // If additional fingers are added before a swipe gesture has been registered, | 677 // If additional fingers are added before a swipe gesture has been registered, |
671 // then wait until all fingers have been lifted. | 678 // then wait until all fingers have been lifted. |
672 if (type == ui::ET_TOUCH_PRESSED || | 679 if (type == ui::ET_TOUCH_PRESSED || |
673 event.touch_id() != initial_press_->touch_id()) { | 680 event.pointer_details().id != initial_press_->pointer_details().id) { |
674 if (sound_timer_.IsRunning()) | 681 if (sound_timer_.IsRunning()) |
675 sound_timer_.Stop(); | 682 sound_timer_.Stop(); |
676 SET_STATE(WAIT_FOR_NO_FINGERS); | 683 SET_STATE(WAIT_FOR_NO_FINGERS); |
677 return EVENT_REWRITE_DISCARD; | 684 return EVENT_REWRITE_DISCARD; |
678 } | 685 } |
679 | 686 |
680 // There should not be more than one finger down. | 687 // There should not be more than one finger down. |
681 DCHECK_LE(current_touch_ids_.size(), 1U); | 688 DCHECK_LE(current_touch_ids_.size(), 1U); |
682 | 689 |
683 // Allows user to return to the edge to adjust the sound if they have left the | 690 // Allows user to return to the edge to adjust the sound if they have left the |
(...skipping 26 matching lines...) Expand all Loading... |
710 std::unique_ptr<ui::Event>* rewritten_event) { | 717 std::unique_ptr<ui::Event>* rewritten_event) { |
711 ui::EventType type = event.type(); | 718 ui::EventType type = event.type(); |
712 if (type == ui::ET_TOUCH_PRESSED) { | 719 if (type == ui::ET_TOUCH_PRESSED) { |
713 // This is now a three finger gesture. | 720 // This is now a three finger gesture. |
714 SET_STATE(GESTURE_IN_PROGRESS); | 721 SET_STATE(GESTURE_IN_PROGRESS); |
715 return ui::EVENT_REWRITE_DISCARD; | 722 return ui::EVENT_REWRITE_DISCARD; |
716 } | 723 } |
717 | 724 |
718 if (type == ui::ET_TOUCH_MOVED) { | 725 if (type == ui::ET_TOUCH_MOVED) { |
719 // Determine if it was a swipe. | 726 // Determine if it was a swipe. |
720 gfx::Point original_location = initial_presses_[event.touch_id()]; | 727 gfx::Point original_location = initial_presses_[event.pointer_details().id]; |
721 float distance = (event.location() - original_location).Length(); | 728 float distance = (event.location() - original_location).Length(); |
722 // If the user moves too far from the original position, consider the | 729 // If the user moves too far from the original position, consider the |
723 // movement a swipe. | 730 // movement a swipe. |
724 if (distance > gesture_detector_config_.touch_slop) { | 731 if (distance > gesture_detector_config_.touch_slop) { |
725 SET_STATE(GESTURE_IN_PROGRESS); | 732 SET_STATE(GESTURE_IN_PROGRESS); |
726 } | 733 } |
727 return ui::EVENT_REWRITE_DISCARD; | 734 return ui::EVENT_REWRITE_DISCARD; |
728 } | 735 } |
729 | 736 |
730 if (current_touch_ids_.size() != 0) | 737 if (current_touch_ids_.size() != 0) |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 case TOUCH_EXPLORE_RELEASED: | 770 case TOUCH_EXPLORE_RELEASED: |
764 SET_STATE(NO_FINGERS_DOWN); | 771 SET_STATE(NO_FINGERS_DOWN); |
765 last_touch_exploration_.reset(new TouchEvent(*initial_press_)); | 772 last_touch_exploration_.reset(new TouchEvent(*initial_press_)); |
766 anchor_point_ = last_touch_exploration_->location_f(); | 773 anchor_point_ = last_touch_exploration_->location_f(); |
767 anchor_point_state_ = ANCHOR_POINT_FROM_TOUCH_EXPLORATION; | 774 anchor_point_state_ = ANCHOR_POINT_FROM_TOUCH_EXPLORATION; |
768 return; | 775 return; |
769 case DOUBLE_TAP_PENDING: { | 776 case DOUBLE_TAP_PENDING: { |
770 SET_STATE(ONE_FINGER_PASSTHROUGH); | 777 SET_STATE(ONE_FINGER_PASSTHROUGH); |
771 passthrough_offset_ = | 778 passthrough_offset_ = |
772 last_unused_finger_event_->location_f() - anchor_point_; | 779 last_unused_finger_event_->location_f() - anchor_point_; |
773 std::unique_ptr<ui::TouchEvent> passthrough_press( | 780 std::unique_ptr<ui::TouchEvent> passthrough_press(new ui::TouchEvent( |
774 new ui::TouchEvent(ui::ET_TOUCH_PRESSED, gfx::Point(), | 781 ui::ET_TOUCH_PRESSED, gfx::Point(), |
775 last_unused_finger_event_->touch_id(), Now())); | 782 last_unused_finger_event_->pointer_details().id, Now())); |
776 passthrough_press->set_location_f(anchor_point_); | 783 passthrough_press->set_location_f(anchor_point_); |
777 passthrough_press->set_root_location_f(anchor_point_); | 784 passthrough_press->set_root_location_f(anchor_point_); |
778 DispatchEvent(passthrough_press.get()); | 785 DispatchEvent(passthrough_press.get()); |
779 return; | 786 return; |
780 } | 787 } |
781 case SINGLE_TAP_PRESSED: | 788 case SINGLE_TAP_PRESSED: |
782 if (passthrough_timer_.IsRunning()) | 789 if (passthrough_timer_.IsRunning()) |
783 return; | 790 return; |
784 case GESTURE_IN_PROGRESS: | 791 case GESTURE_IN_PROGRESS: |
785 // If only one finger is down, go into touch exploration. | 792 // If only one finger is down, go into touch exploration. |
(...skipping 21 matching lines...) Expand all Loading... |
807 anchor_point_state_ = ANCHOR_POINT_FROM_TOUCH_EXPLORATION; | 814 anchor_point_state_ = ANCHOR_POINT_FROM_TOUCH_EXPLORATION; |
808 } | 815 } |
809 | 816 |
810 void TouchExplorationController::OnPassthroughTimerFired() { | 817 void TouchExplorationController::OnPassthroughTimerFired() { |
811 // The passthrough timer will only fire if if the user has held a finger in | 818 // The passthrough timer will only fire if if the user has held a finger in |
812 // one of the passthrough corners for the duration of the passthrough timeout. | 819 // one of the passthrough corners for the duration of the passthrough timeout. |
813 | 820 |
814 // Check that initial press isn't null. Also a check that if the initial | 821 // Check that initial press isn't null. Also a check that if the initial |
815 // corner press was released, then it should not be in corner passthrough. | 822 // corner press was released, then it should not be in corner passthrough. |
816 if (!initial_press_ || | 823 if (!initial_press_ || |
817 touch_locations_.find(initial_press_->touch_id()) != | 824 touch_locations_.find(initial_press_->pointer_details().id) != |
818 touch_locations_.end()) { | 825 touch_locations_.end()) { |
819 } | 826 } |
820 | 827 |
821 gfx::Point location = | 828 gfx::Point location = |
822 ToRoundedPoint(touch_locations_[initial_press_->touch_id()]); | 829 ToRoundedPoint(touch_locations_[initial_press_->pointer_details().id]); |
823 int corner = FindEdgesWithinBounds(location, kSlopDistanceFromEdge); | 830 int corner = FindEdgesWithinBounds(location, kSlopDistanceFromEdge); |
824 if (corner != BOTTOM_LEFT_CORNER && corner != BOTTOM_RIGHT_CORNER) | 831 if (corner != BOTTOM_LEFT_CORNER && corner != BOTTOM_RIGHT_CORNER) |
825 return; | 832 return; |
826 | 833 |
827 if (sound_timer_.IsRunning()) | 834 if (sound_timer_.IsRunning()) |
828 sound_timer_.Stop(); | 835 sound_timer_.Stop(); |
829 delegate_->PlayPassthroughEarcon(); | 836 delegate_->PlayPassthroughEarcon(); |
830 SET_STATE(CORNER_PASSTHROUGH); | 837 SET_STATE(CORNER_PASSTHROUGH); |
831 return; | 838 return; |
832 } | 839 } |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1126 VLOG(1) << "\n Function name: " << function_name | 1133 VLOG(1) << "\n Function name: " << function_name |
1127 << "\n State: " << state_string; | 1134 << "\n State: " << state_string; |
1128 } | 1135 } |
1129 | 1136 |
1130 void TouchExplorationController::VlogEvent(const ui::TouchEvent& touch_event, | 1137 void TouchExplorationController::VlogEvent(const ui::TouchEvent& touch_event, |
1131 const char* function_name) { | 1138 const char* function_name) { |
1132 if (!VLOG_on_) | 1139 if (!VLOG_on_) |
1133 return; | 1140 return; |
1134 | 1141 |
1135 if (prev_event_ && prev_event_->type() == touch_event.type() && | 1142 if (prev_event_ && prev_event_->type() == touch_event.type() && |
1136 prev_event_->touch_id() == touch_event.touch_id()) { | 1143 prev_event_->pointer_details().id == touch_event.pointer_details().id) { |
1137 return; | 1144 return; |
1138 } | 1145 } |
1139 // The above statement prevents events of the same type and id from being | 1146 // The above statement prevents events of the same type and id from being |
1140 // printed in a row. However, if two fingers are down, they would both be | 1147 // printed in a row. However, if two fingers are down, they would both be |
1141 // moving and alternating printing move events unless we check for this. | 1148 // moving and alternating printing move events unless we check for this. |
1142 if (prev_event_ && prev_event_->type() == ET_TOUCH_MOVED && | 1149 if (prev_event_ && prev_event_->type() == ET_TOUCH_MOVED && |
1143 touch_event.type() == ET_TOUCH_MOVED) { | 1150 touch_event.type() == ET_TOUCH_MOVED) { |
1144 return; | 1151 return; |
1145 } | 1152 } |
1146 | 1153 |
1147 const std::string& type = touch_event.name(); | 1154 const std::string& type = touch_event.name(); |
1148 const gfx::PointF& location = touch_event.location_f(); | 1155 const gfx::PointF& location = touch_event.location_f(); |
1149 const int touch_id = touch_event.touch_id(); | 1156 const int touch_id = touch_event.pointer_details().id; |
1150 | 1157 |
1151 VLOG(1) << "\n Function name: " << function_name << "\n Event Type: " << type | 1158 VLOG(1) << "\n Function name: " << function_name << "\n Event Type: " << type |
1152 << "\n Location: " << location.ToString() | 1159 << "\n Location: " << location.ToString() |
1153 << "\n Touch ID: " << touch_id; | 1160 << "\n Touch ID: " << touch_id; |
1154 prev_event_.reset(new TouchEvent(touch_event)); | 1161 prev_event_.reset(new TouchEvent(touch_event)); |
1155 } | 1162 } |
1156 | 1163 |
1157 const char* TouchExplorationController::EnumStateToString(State state) { | 1164 const char* TouchExplorationController::EnumStateToString(State state) { |
1158 switch (state) { | 1165 switch (state) { |
1159 case NO_FINGERS_DOWN: | 1166 case NO_FINGERS_DOWN: |
(...skipping 26 matching lines...) Expand all Loading... |
1186 return "TWO_FINGER_TAP"; | 1193 return "TWO_FINGER_TAP"; |
1187 } | 1194 } |
1188 return "Not a state"; | 1195 return "Not a state"; |
1189 } | 1196 } |
1190 | 1197 |
1191 float TouchExplorationController::GetSplitTapTouchSlop() { | 1198 float TouchExplorationController::GetSplitTapTouchSlop() { |
1192 return gesture_detector_config_.touch_slop * 3; | 1199 return gesture_detector_config_.touch_slop * 3; |
1193 } | 1200 } |
1194 | 1201 |
1195 } // namespace ui | 1202 } // namespace ui |
OLD | NEW |