Chromium Code Reviews| Index: ui/chromeos/touch_exploration_controller.cc |
| diff --git a/ui/chromeos/touch_exploration_controller.cc b/ui/chromeos/touch_exploration_controller.cc |
| index 7028d787d95b0039a719776191f3fc23311d36c1..eb38ffcd96a199679888632b662e1d056c2d6ae0 100644 |
| --- a/ui/chromeos/touch_exploration_controller.cc |
| +++ b/ui/chromeos/touch_exploration_controller.cc |
| @@ -130,6 +130,8 @@ ui::EventRewriteStatus TouchExplorationController::RewriteEvent( |
| return InTouchExploration(touch_event, rewritten_event); |
| case PASSTHROUGH_MINUS_ONE: |
| return InPassthroughMinusOne(touch_event, rewritten_event); |
| + case TE_SECOND_PRESS: |
| + return InTouchExplSecondPress(touch_event, rewritten_event); |
| } |
| NOTREACHED(); |
| @@ -198,11 +200,16 @@ ui::EventRewriteStatus TouchExplorationController::InSingleTapReleased( |
| if (type == ui::ET_TOUCH_PRESSED) { |
| // This is the second tap in a double-tap (or double tap-hold). |
| // Rewrite at location of last touch exploration. |
| - ui::TouchEvent* rewritten_press_event = new ui::TouchEvent( |
| - ui::ET_TOUCH_PRESSED, |
| - last_touch_exploration_location_, |
| - event.touch_id(), |
| - event.time_stamp()); |
| + // If there is no touch exploration yet, initialize last_touch_exploration_ |
| + // to the this location. |
|
aboxhall
2014/06/13 18:20:00
grammar weirdness: "the this"
evy
2014/06/13 20:27:39
Done.
|
| + if (last_touch_exploration_ == NULL) { |
| + last_touch_exploration_.reset(new TouchEvent(event)); |
|
aboxhall
2014/06/13 18:20:00
This makes more sense now, but I wonder whether we
evy
2014/06/13 20:27:39
Hm, so we just wouldn't process the second click -
aboxhall
2014/06/13 20:52:49
Yeah, that's what I'm suggesting, but I'm not asse
evy
2014/06/13 22:03:47
TalkBack just discards it, so I'll have our code d
aboxhall
2014/06/13 22:09:00
Looks good!
|
| + } |
| + ui::TouchEvent* rewritten_press_event = |
| + new ui::TouchEvent(ui::ET_TOUCH_PRESSED, |
| + last_touch_exploration_->location(), |
| + event.touch_id(), |
| + event.time_stamp()); |
| rewritten_press_event->set_flags(event.flags()); |
| rewritten_event->reset(rewritten_press_event); |
| state_ = DOUBLE_TAP_PRESSED; |
| @@ -226,7 +233,7 @@ ui::EventRewriteStatus TouchExplorationController::InDoubleTapPressed( |
| // Rewrite at location of last touch exploration. |
| ui::TouchEvent* rewritten_release_event = new ui::TouchEvent( |
| ui::ET_TOUCH_RELEASED, |
| - last_touch_exploration_location_, |
| + last_touch_exploration_->location(), |
| event.touch_id(), |
| event.time_stamp()); |
| rewritten_release_event->set_flags(event.flags()); |
| @@ -244,10 +251,20 @@ ui::EventRewriteStatus TouchExplorationController::InTouchExploration( |
| const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event) { |
| const ui::EventType type = event.type(); |
| if (type == ui::ET_TOUCH_PRESSED) { |
| - |
| - // Ignore any additional fingers when we're already in touch exploration |
| - // mode. TODO(evy, lisayin): Support "split-tap" here instead. |
| - return ui::EVENT_REWRITE_DISCARD; |
| + // Split-tap |
| + initial_press_.reset(new TouchEvent(event)); |
| + if (tap_timer_.IsRunning()) |
| + tap_timer_.Stop(); |
| + ui::TouchEvent* rewritten_touch_event = |
| + new ui::TouchEvent(ui::ET_TOUCH_PRESSED, |
| + last_touch_exploration_->location(), |
| + event.touch_id(), |
| + event.time_stamp()); |
| + rewritten_touch_event->set_flags(event.flags()); |
| + rewritten_event->reset(rewritten_touch_event); |
| + state_ = TE_SECOND_PRESS; |
| + VLOG_STATE(); |
| + return ui::EVENT_REWRITE_REWRITTEN; |
| } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { |
| if (current_touch_ids_.size() == 0) |
| ResetToNoFingersDown(); |
| @@ -258,7 +275,7 @@ ui::EventRewriteStatus TouchExplorationController::InTouchExploration( |
| // Rewrite as a mouse-move event. |
| *rewritten_event = CreateMouseMoveEvent(event.location(), event.flags()); |
| - last_touch_exploration_location_ = event.location(); |
| + last_touch_exploration_.reset(new TouchEvent(event)); |
| return ui::EVENT_REWRITE_REWRITTEN; |
| } |
| @@ -309,6 +326,48 @@ ui::EventRewriteStatus TouchExplorationController::InPassthroughMinusOne( |
| return ui::EVENT_REWRITE_CONTINUE; |
| } |
| +ui::EventRewriteStatus TouchExplorationController::InTouchExplSecondPress( |
| + const ui::TouchEvent& event, |
| + scoped_ptr<ui::Event>* rewritten_event) { |
| + ui::EventType type = event.type(); |
| + gfx::PointF location = event.location_f(); |
| + if (type == ui::ET_TOUCH_PRESSED) { |
| + return ui::EVENT_REWRITE_DISCARD; |
| + } else if (type == ui::ET_TOUCH_MOVED) { |
| + // Currently this is a discard, but could be something like rotor |
| + // in the future. |
| + return ui::EVENT_REWRITE_DISCARD; |
| + } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { |
| + // If the touch exploration finger is lifted, there is no option to return |
| + // to touch explore anymore. The remaining finger acts as a pending |
| + // tap or long tap for the last touch explore location. |
| + if (event.touch_id() == last_touch_exploration_->touch_id()){ |
| + state_ = DOUBLE_TAP_PRESSED; |
| + VLOG_STATE(); |
| + return EVENT_REWRITE_DISCARD; |
| + } |
| + |
| + // Continue to release the touch only if the touch explore finger is the |
| + // only finger remaining. |
| + if (current_touch_ids_.size() != 1) |
| + return EVENT_REWRITE_DISCARD; |
| + |
| + // Rewrite at location of last touch exploration. |
| + ui::TouchEvent* rewritten_release_event = new ui::TouchEvent( |
| + ui::ET_TOUCH_RELEASED, |
| + last_touch_exploration_->location(), |
| + initial_press_->touch_id(), |
| + event.time_stamp()); |
| + rewritten_release_event->set_flags(event.flags()); |
| + rewritten_event->reset(rewritten_release_event); |
| + state_ = TOUCH_EXPLORATION; |
| + VLOG_STATE(); |
| + return ui::EVENT_REWRITE_REWRITTEN; |
| + } |
| + NOTREACHED() << "Unexpected event type received."; |
| + return ui::EVENT_REWRITE_CONTINUE; |
| +} |
| + |
| void TouchExplorationController::OnTapTimerFired() { |
| if (state_ != SINGLE_TAP_RELEASED && state_ != SINGLE_TAP_PRESSED) |
| return; |
| @@ -324,7 +383,7 @@ void TouchExplorationController::OnTapTimerFired() { |
| scoped_ptr<ui::Event> mouse_move = CreateMouseMoveEvent( |
| initial_press_->location(), initial_press_->flags()); |
| DispatchEvent(mouse_move.get()); |
| - last_touch_exploration_location_ = initial_press_->location(); |
| + last_touch_exploration_.reset(new TouchEvent(*initial_press_)); |
| } |
| void TouchExplorationController::DispatchEvent(ui::Event* event) { |
| @@ -406,6 +465,8 @@ const char* TouchExplorationController::EnumStateToString(State state) { |
| return "TOUCH_EXPLORATION"; |
| case PASSTHROUGH_MINUS_ONE: |
| return "PASSTHROUGH_MINUS_ONE"; |
| + case TE_SECOND_PRESS: |
| + return "TE_SECOND_PRESS"; |
| } |
| return "Not a state"; |
| } |