Index: ui/chromeos/touch_exploration_controller.cc |
diff --git a/ui/chromeos/touch_exploration_controller.cc b/ui/chromeos/touch_exploration_controller.cc |
index c86d5e5d74975c729c4ccad21e1e0bb31e95b8b7..1a77b971aa9b0c7ad59f56d2004267541b4592dc 100644 |
--- a/ui/chromeos/touch_exploration_controller.cc |
+++ b/ui/chromeos/touch_exploration_controller.cc |
@@ -18,17 +18,11 @@ |
namespace ui { |
-namespace { |
-// In ChromeOS, VKEY_LWIN is synonymous for the search key. |
-const ui::KeyboardCode kChromeOSSearchKey = ui::VKEY_LWIN; |
-} // namespace |
- |
TouchExplorationController::TouchExplorationController( |
aura::Window* root_window) |
: root_window_(root_window), |
state_(NO_FINGERS_DOWN), |
event_handler_for_testing_(NULL), |
- gesture_provider_(this), |
prev_state_(NO_FINGERS_DOWN) { |
CHECK(root_window); |
root_window->GetHost()->GetEventSource()->AddEventRewriter(this); |
@@ -52,10 +46,6 @@ |
bool TouchExplorationController::IsInNoFingersDownStateForTesting() const { |
return state_ == NO_FINGERS_DOWN; |
-} |
- |
-bool TouchExplorationController::IsInGestureInProgressStateForTesting() const { |
- return state_ == GESTURE_IN_PROGRESS; |
} |
ui::EventRewriteStatus TouchExplorationController::RewriteEvent( |
@@ -68,6 +58,9 @@ |
<< " Key code: " << key_event.key_code() |
<< ", Flags: " << key_event.flags() |
<< ", Is char: " << key_event.is_char(); |
+ } |
+ if(event.IsGestureEvent()){ |
+ VLOG(0) << "\n Gesture event " << event.name(); |
} |
return ui::EVENT_REWRITE_CONTINUE; |
} |
@@ -130,8 +123,6 @@ |
return InDoubleTapPressed(touch_event, rewritten_event); |
case TOUCH_EXPLORATION: |
return InTouchExploration(touch_event, rewritten_event); |
- case GESTURE_IN_PROGRESS: |
- return InGestureInProgress(touch_event, rewritten_event); |
case TOUCH_EXPLORE_SECOND_PRESS: |
return InTouchExploreSecondPress(touch_event, rewritten_event); |
case TWO_TO_ONE_FINGER: |
@@ -161,9 +152,6 @@ |
gesture_detector_config_.double_tap_timeout, |
this, |
&TouchExplorationController::OnTapTimerFired); |
- gesture_provider_.OnTouchEvent(event); |
- gesture_provider_.OnTouchEventAck(false); |
- ProcessGestureEvents(); |
state_ = SINGLE_TAP_PRESSED; |
VLOG_STATE(); |
return ui::EVENT_REWRITE_DISCARD; |
@@ -194,33 +182,19 @@ |
VLOG_STATE(); |
return EVENT_REWRITE_DISCARD; |
} else if (type == ui::ET_TOUCH_MOVED) { |
- float distance = (event.location() - initial_press_->location()).Length(); |
- // If the user does not move far enough from the original position, then the |
- // resulting movement should not be considered to be a deliberate gesture or |
- // touch exploration. |
- if (distance <= gesture_detector_config_.touch_slop) |
- return EVENT_REWRITE_DISCARD; |
- |
- float delta_time = |
- (event.time_stamp() - initial_press_->time_stamp()).InSecondsF(); |
- float velocity = distance / delta_time; |
- VLOG(0) << "\n Delta time: " << delta_time |
- << "\n Distance: " << distance |
- << "\n Velocity of click: " << velocity |
- << "\n Minimum swipe velocity: " |
- << gesture_detector_config_.minimum_swipe_velocity; |
- |
- // If the user moves fast enough from the initial touch location, start |
- // gesture detection. Otherwise, jump to the touch exploration mode early. |
- if (velocity > gesture_detector_config_.minimum_swipe_velocity) { |
- state_ = GESTURE_IN_PROGRESS; |
+ // If the user moves far enough from the initial touch location (outside |
+ // the "slop" region, jump to the touch exploration mode early. |
+ // TODO(evy, lisayin): Add gesture recognition here instead - |
+ // we should probably jump to gesture mode here if the velocity is |
+ // high enough, and touch exploration if the velocity is lower. |
+ float delta = (event.location() - initial_press_->location()).Length(); |
+ if (delta > gesture_detector_config_.touch_slop) { |
+ EnterTouchToMouseMode(); |
+ state_ = TOUCH_EXPLORATION; |
VLOG_STATE(); |
- return InGestureInProgress(event, rewritten_event); |
- } |
- EnterTouchToMouseMode(); |
- state_ = TOUCH_EXPLORATION; |
- VLOG_STATE(); |
- return InTouchExploration(event, rewritten_event); |
+ return InTouchExploration(event, rewritten_event); |
+ } |
+ return EVENT_REWRITE_DISCARD; |
} |
NOTREACHED() << "Unexpected event type received."; |
return ui::EVENT_REWRITE_CONTINUE; |
@@ -231,23 +205,13 @@ |
const ui::TouchEvent& event, |
scoped_ptr<ui::Event>* rewritten_event) { |
const ui::EventType type = event.type(); |
- // If there is more than one finger down, then discard to wait until only one |
- // finger is or no fingers are down. |
- if (current_touch_ids_.size() > 1) { |
- state_ = WAIT_FOR_RELEASE; |
- return ui::EVENT_REWRITE_DISCARD; |
- } |
- // If there is no touch exploration yet, discard. |
- if (!last_touch_exploration_ || type == ui::ET_TOUCH_RELEASED) { |
- if (current_touch_ids_.size() == 0) { |
- ResetToNoFingersDown(); |
- } |
- return ui::EVENT_REWRITE_DISCARD; |
- } |
- |
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. |
+ // If there is no touch exploration yet, discard instead. |
+ if (!last_touch_exploration_) { |
+ return ui::EVENT_REWRITE_DISCARD; |
+ } |
rewritten_event->reset( |
new ui::TouchEvent(ui::ET_TOUCH_PRESSED, |
last_touch_exploration_->location(), |
@@ -257,6 +221,13 @@ |
state_ = DOUBLE_TAP_PRESSED; |
VLOG_STATE(); |
return ui::EVENT_REWRITE_REWRITTEN; |
+ } else if (type == ui::ET_TOUCH_RELEASED && !last_touch_exploration_) { |
+ // If the previous press was discarded, we need to also handle its |
+ // release. |
+ if (current_touch_ids_.size() == 0) { |
+ ResetToNoFingersDown(); |
+ } |
+ return ui::EVENT_REWRITE_DISCARD; |
} |
NOTREACHED() << "Unexpected event type received."; |
return ui::EVENT_REWRITE_CONTINUE; |
@@ -272,7 +243,7 @@ |
return EVENT_REWRITE_DISCARD; |
// Rewrite release at location of last touch exploration with the same |
- // id as the previous press. |
+ // id as the prevoius press. |
rewritten_event->reset( |
new ui::TouchEvent(ui::ET_TOUCH_RELEASED, |
last_touch_exploration_->location(), |
@@ -325,44 +296,6 @@ |
return ui::EVENT_REWRITE_REWRITTEN; |
} |
-ui::EventRewriteStatus TouchExplorationController::InGestureInProgress( |
- const ui::TouchEvent& event, |
- scoped_ptr<ui::Event>* rewritten_event) { |
- ui::EventType type = event.type(); |
- // If additional fingers are added before a swipe gesture has been registered, |
- // then the state will no longer be GESTURE_IN_PROGRESS. |
- if (type == ui::ET_TOUCH_PRESSED || |
- event.touch_id() != initial_press_->touch_id()) { |
- if (tap_timer_.IsRunning()) |
- tap_timer_.Stop(); |
- // Discard any pending gestures. |
- ignore_result(gesture_provider_.GetAndResetPendingGestures()); |
- state_ = TWO_TO_ONE_FINGER; |
- last_two_to_one_.reset(new TouchEvent(event)); |
- rewritten_event->reset(new ui::TouchEvent(ui::ET_TOUCH_PRESSED, |
- event.location(), |
- event.touch_id(), |
- event.time_stamp())); |
- (*rewritten_event)->set_flags(event.flags()); |
- return EVENT_REWRITE_REWRITTEN; |
- } |
- |
- // There should not be more than one finger down. |
- DCHECK(current_touch_ids_.size() <= 1); |
- if (type == ui::ET_TOUCH_MOVED) { |
- gesture_provider_.OnTouchEvent(event); |
- gesture_provider_.OnTouchEventAck(false); |
- } |
- if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { |
- gesture_provider_.OnTouchEvent(event); |
- gesture_provider_.OnTouchEventAck(false); |
- if (current_touch_ids_.size() == 0) |
- ResetToNoFingersDown(); |
- } |
- |
- ProcessGestureEvents(); |
- return ui::EVENT_REWRITE_DISCARD; |
-} |
ui::EventRewriteStatus TouchExplorationController::InTwoToOneFinger( |
const ui::TouchEvent& event, |
@@ -481,7 +414,6 @@ |
initial_press_->touch_id(), |
event.time_stamp())); |
(*rewritten_event)->set_flags(event.flags()); |
- EnterTouchToMouseMode(); |
state_ = TOUCH_EXPLORATION; |
VLOG_STATE(); |
return ui::EVENT_REWRITE_REWRITTEN; |
@@ -501,7 +433,6 @@ |
} |
if (current_touch_ids_.size() == 0) { |
state_ = NO_FINGERS_DOWN; |
- VLOG_STATE(); |
ResetToNoFingersDown(); |
} |
return EVENT_REWRITE_DISCARD; |
@@ -517,9 +448,6 @@ |
last_touch_exploration_.reset(new TouchEvent(*initial_press_)); |
return; |
case SINGLE_TAP_PRESSED: |
- case GESTURE_IN_PROGRESS: |
- // Discard any pending gestures. |
- ignore_result(gesture_provider_.GetAndResetPendingGestures()); |
EnterTouchToMouseMode(); |
state_ = TOUCH_EXPLORATION; |
VLOG_STATE(); |
@@ -527,11 +455,12 @@ |
default: |
return; |
} |
- scoped_ptr<ui::Event> mouse_move = |
- CreateMouseMoveEvent(initial_press_->location(), initial_press_->flags()); |
+ |
+ scoped_ptr<ui::Event> mouse_move = CreateMouseMoveEvent( |
+ initial_press_->location(), initial_press_->flags()); |
DispatchEvent(mouse_move.get()); |
last_touch_exploration_.reset(new TouchEvent(*initial_press_)); |
- } |
+} |
void TouchExplorationController::DispatchEvent(ui::Event* event) { |
if (event_handler_for_testing_) { |
@@ -540,68 +469,6 @@ |
} |
ui::EventDispatchDetails result ALLOW_UNUSED = |
root_window_->GetHost()->dispatcher()->OnEventFromSource(event); |
-} |
- |
-void TouchExplorationController::OnGestureEvent(ui::GestureEvent* gesture) { |
- CHECK(gesture->IsGestureEvent()); |
- VLOG(0) << " \n Gesture Triggered: " << gesture->name(); |
- if (gesture->type() == ui::ET_GESTURE_SWIPE) { |
- if (tap_timer_.IsRunning()) |
- tap_timer_.Stop(); |
- OnSwipeEvent(gesture); |
- return; |
- } |
-} |
- |
-void TouchExplorationController::ProcessGestureEvents() { |
- scoped_ptr<ScopedVector<ui::GestureEvent> > gestures( |
- gesture_provider_.GetAndResetPendingGestures()); |
- if (gestures) { |
- for (ScopedVector<GestureEvent>::iterator i = gestures->begin(); |
- i != gestures->end(); |
- ++i) { |
- OnGestureEvent(*i); |
- } |
- } |
-} |
- |
-void TouchExplorationController::OnSwipeEvent(ui::GestureEvent* swipe_gesture) { |
- // A swipe gesture contains details for the direction in which the swipe |
- // occurred. |
- GestureEventDetails event_details = swipe_gesture->details(); |
- if (event_details.swipe_left()) { |
- DispatchShiftSearchKeyEvent(ui::VKEY_LEFT); |
- return; |
- } else if (event_details.swipe_right()) { |
- DispatchShiftSearchKeyEvent(ui::VKEY_RIGHT); |
- return; |
- } else if (event_details.swipe_up()) { |
- DispatchShiftSearchKeyEvent(ui::VKEY_UP); |
- return; |
- } else if (event_details.swipe_down()) { |
- DispatchShiftSearchKeyEvent(ui::VKEY_DOWN); |
- return; |
- } |
-} |
- |
-void TouchExplorationController::DispatchShiftSearchKeyEvent( |
- const ui::KeyboardCode direction) { |
- // In order to activate the shortcut shift+search+<arrow key> |
- // three KeyPressed events must be dispatched in succession along |
- // with three KeyReleased events. |
- DispatchEvent(new ui::KeyEvent( |
- ui::ET_KEY_PRESSED, ui::VKEY_SHIFT, ui::EF_SHIFT_DOWN, false)); |
- DispatchEvent(new ui::KeyEvent( |
- ui::ET_KEY_PRESSED, kChromeOSSearchKey, ui::EF_SHIFT_DOWN, false)); |
- DispatchEvent(new ui::KeyEvent( |
- ui::ET_KEY_PRESSED, direction, ui::EF_SHIFT_DOWN, false)); |
- |
- DispatchEvent(new ui::KeyEvent( |
- ui::ET_KEY_RELEASED, direction, ui::EF_SHIFT_DOWN, false)); |
- DispatchEvent(new ui::KeyEvent( |
- ui::ET_KEY_RELEASED, kChromeOSSearchKey, ui::EF_SHIFT_DOWN, false)); |
- DispatchEvent(new ui::KeyEvent( |
- ui::ET_KEY_RELEASED, ui::VKEY_SHIFT, ui::EF_NONE, false)); |
} |
scoped_ptr<ui::Event> TouchExplorationController::CreateMouseMoveEvent( |
@@ -682,8 +549,6 @@ |
return "DOUBLE_TAP_PRESSED"; |
case TOUCH_EXPLORATION: |
return "TOUCH_EXPLORATION"; |
- case GESTURE_IN_PROGRESS: |
- return "GESTURE_IN_PROGRESS"; |
case TOUCH_EXPLORE_SECOND_PRESS: |
return "TOUCH_EXPLORE_SECOND_PRESS"; |
case TWO_TO_ONE_FINGER: |