Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(279)

Unified Diff: ui/chromeos/touch_exploration_controller.cc

Issue 429633002: Added multi-finger gestures to touch_exploration_controller (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@passthrough
Patch Set: gesture provider doesn't recieve all events and is reset in ResetToNoFingersDown Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/chromeos/touch_exploration_controller.cc
diff --git a/ui/chromeos/touch_exploration_controller.cc b/ui/chromeos/touch_exploration_controller.cc
index 6b2584afc7f2afc4c3d6bec3c3491e1fb11ae054..fe49d6903c1400ba27ed801108ea03909630cee0 100644
--- a/ui/chromeos/touch_exploration_controller.cc
+++ b/ui/chromeos/touch_exploration_controller.cc
@@ -6,6 +6,7 @@
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
+#include "base/time/default_tick_clock.h"
#include "ui/aura/client/cursor_client.h"
#include "ui/aura/window.h"
#include "ui/aura/window_event_dispatcher.h"
@@ -36,12 +37,13 @@ TouchExplorationController::TouchExplorationController(
delegate_(delegate),
state_(NO_FINGERS_DOWN),
event_handler_for_testing_(NULL),
- gesture_provider_(this),
prev_state_(NO_FINGERS_DOWN),
VLOG_on_(true),
tick_clock_(NULL) {
CHECK(root_window);
root_window->GetHost()->GetEventSource()->AddEventRewriter(this);
+ InitializeSwipeGestureMaps();
+ gesture_provider_.reset(new GestureProviderAura(this));
}
TouchExplorationController::~TouchExplorationController() {
@@ -52,6 +54,13 @@ ui::EventRewriteStatus TouchExplorationController::RewriteEvent(
const ui::Event& event,
scoped_ptr<ui::Event>* rewritten_event) {
if (!event.IsTouchEvent()) {
+ if (event.IsKeyEvent()) {
+ const ui::KeyEvent& key_event = static_cast<const ui::KeyEvent&>(event);
+ VLOG(0) << "\nKeyboard event: " << key_event.name()
+ << "\n Key code: " << key_event.key_code()
+ << ", Flags: " << key_event.flags()
+ << ", Is char: " << key_event.is_char();
+ }
return ui::EVENT_REWRITE_CONTINUE;
}
const ui::TouchEvent& touch_event = static_cast<const ui::TouchEvent&>(event);
@@ -79,8 +88,8 @@ ui::EventRewriteStatus TouchExplorationController::RewriteEvent(
current_touch_ids_.push_back(touch_id);
touch_locations_.insert(std::pair<int, gfx::PointF>(touch_id, location));
} else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) {
- // In order to avoid accidentally double tapping when moving off the edge of
- // the screen, the state will be rewritten to NoFingersDown.
+ // In order to avoid accidentally double tapping when moving off the edge
+ // of the screen, the state will be rewritten to NoFingersDown.
TouchEvent touch_event = static_cast<const TouchEvent&>(event);
if (FindEdgesWithinBounds(touch_event.location(), kLeavingScreenEdge) !=
NO_EDGE) {
@@ -107,11 +116,28 @@ ui::EventRewriteStatus TouchExplorationController::RewriteEvent(
return ui::EVENT_REWRITE_CONTINUE;
touch_locations_[*it] = location;
+ } else {
+ NOTREACHED() << "Unexpected event type received: " << event.name();
+ return ui::EVENT_REWRITE_CONTINUE;
}
VLOG_STATE();
VLOG_EVENT(touch_event);
+
+ // If the user is in a gesture state, or if there is a possiblity that the
+ // user will enter it in the future, we send the event to the gesture
+ // provider so it can keep track of the state of the fingers.
+ // TODO(lisayin, evy): Add the two finger hold state when that's completed.
+ if (state_ == NO_FINGERS_DOWN ||
+ state_ == SINGLE_TAP_PRESSED ||
+ state_ == GESTURE_IN_PROGRESS ||
+ state_ == SLIDE_GESTURE) {
+ gesture_provider_->OnTouchEvent(touch_event);
+ gesture_provider_->OnTouchEventAck(false);
+ ProcessGestureEvents();
+ }
+
// The rest of the processing depends on what state we're in.
- switch(state_) {
+ switch (state_) {
case NO_FINGERS_DOWN:
return InNoFingersDown(touch_event, rewritten_event);
case SINGLE_TAP_PRESSED:
@@ -129,12 +155,12 @@ ui::EventRewriteStatus TouchExplorationController::RewriteEvent(
return InGestureInProgress(touch_event, rewritten_event);
case TOUCH_EXPLORE_SECOND_PRESS:
return InTouchExploreSecondPress(touch_event, rewritten_event);
- case SLIDE_GESTURE:
- return InSlideGesture(touch_event, rewritten_event);
case ONE_FINGER_PASSTHROUGH:
return InOneFingerPassthrough(touch_event, rewritten_event);
- case WAIT_FOR_ONE_FINGER:
- return InWaitForOneFinger(touch_event, rewritten_event);
+ case WAIT_FOR_NO_FINGERS:
+ return InWaitForNoFingers(touch_event, rewritten_event);
+ case SLIDE_GESTURE:
+ return InSlideGesture(touch_event, rewritten_event);
}
NOTREACHED();
return ui::EVENT_REWRITE_CONTINUE;
@@ -153,9 +179,6 @@ ui::EventRewriteStatus TouchExplorationController::InNoFingersDown(
initial_press_.reset(new TouchEvent(event));
last_unused_finger_event_.reset(new TouchEvent(event));
StartTapTimer();
- gesture_provider_.OnTouchEvent(event);
- gesture_provider_.OnTouchEventAck(false);
- ProcessGestureEvents();
state_ = SINGLE_TAP_PRESSED;
VLOG_STATE();
return ui::EVENT_REWRITE_DISCARD;
@@ -169,10 +192,10 @@ ui::EventRewriteStatus TouchExplorationController::InSingleTapPressed(
const ui::EventType type = event.type();
if (type == ui::ET_TOUCH_PRESSED) {
- // TODO (evy, lisayin) : add support for multifinger swipes.
- // For now, we wait for there to be only one finger down again.
- state_ = WAIT_FOR_ONE_FINGER;
- return EVENT_REWRITE_DISCARD;
+ // This is the start of a multifinger gesture.
+ state_ = GESTURE_IN_PROGRESS;
+ VLOG_STATE();
+ return InGestureInProgress(event, rewritten_event);
} else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) {
if (current_touch_ids_.size() == 0 &&
event.touch_id() == initial_press_->touch_id()) {
@@ -219,7 +242,7 @@ ui::EventRewriteStatus TouchExplorationController::InSingleTapPressed(
VLOG_STATE();
return InTouchExploration(event, rewritten_event);
}
- NOTREACHED() << "Unexpected event type received: " << event.name();
+ NOTREACHED();
return ui::EVENT_REWRITE_CONTINUE;
}
@@ -228,10 +251,11 @@ TouchExplorationController::InSingleTapOrTouchExploreReleased(
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 there is more than one finger down, then discard to wait until no
+ // fingers are down.
if (current_touch_ids_.size() > 1) {
- state_ = WAIT_FOR_ONE_FINGER;
+ state_ = WAIT_FOR_NO_FINGERS;
+ VLOG_STATE();
return ui::EVENT_REWRITE_DISCARD;
}
if (type == ui::ET_TOUCH_PRESSED) {
@@ -246,6 +270,9 @@ TouchExplorationController::InSingleTapOrTouchExploreReleased(
// release at the location of the last touch exploration.
state_ = DOUBLE_TAP_PENDING;
VLOG_STATE();
+ // The old tap timer (from the initial click) is stopped if it is still
+ // going, and the new one is set.
+ tap_timer_.Stop();
StartTapTimer();
// This will update as the finger moves before a possible passthrough, and
// will determine the offset.
@@ -261,7 +288,7 @@ TouchExplorationController::InSingleTapOrTouchExploreReleased(
} else if (type == ui::ET_TOUCH_MOVED) {
return ui::EVENT_REWRITE_DISCARD;
}
- NOTREACHED() << "Unexpected event type received: " << event.name();
+ NOTREACHED();
return ui::EVENT_REWRITE_CONTINUE;
}
@@ -300,7 +327,7 @@ ui::EventRewriteStatus TouchExplorationController::InDoubleTapPending(
ResetToNoFingersDown();
return ui::EVENT_REWRITE_REWRITTEN;
}
- NOTREACHED() << "Unexpected event type received: " << event.name();
+ NOTREACHED();
return ui::EVENT_REWRITE_CONTINUE;
}
@@ -323,7 +350,7 @@ ui::EventRewriteStatus TouchExplorationController::InTouchReleasePending(
ResetToNoFingersDown();
return ui::EVENT_REWRITE_REWRITTEN;
}
- NOTREACHED() << "Unexpected event type received: " << event.name();
+ NOTREACHED();
return ui::EVENT_REWRITE_CONTINUE;
}
@@ -334,8 +361,7 @@ ui::EventRewriteStatus TouchExplorationController::InTouchExploration(
if (type == ui::ET_TOUCH_PRESSED) {
// Handle split-tap.
initial_press_.reset(new TouchEvent(event));
- if (tap_timer_.IsRunning())
- tap_timer_.Stop();
+ tap_timer_.Stop();
rewritten_event->reset(
new ui::TouchEvent(ui::ET_TOUCH_PRESSED,
last_touch_exploration_->location(),
@@ -351,7 +377,7 @@ ui::EventRewriteStatus TouchExplorationController::InTouchExploration(
state_ = TOUCH_EXPLORE_RELEASED;
VLOG_STATE();
} else if (type != ui::ET_TOUCH_MOVED) {
- NOTREACHED() << "Unexpected event type received: " << event.name();
+ NOTREACHED();
return ui::EVENT_REWRITE_CONTINUE;
}
@@ -364,46 +390,19 @@ ui::EventRewriteStatus TouchExplorationController::InTouchExploration(
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.
- delete gesture_provider_.GetAndResetPendingGestures();
- state_ = WAIT_FOR_ONE_FINGER;
- return EVENT_REWRITE_DISCARD;
- }
-
- // 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();
- }
+ // The events were sent to the gesture provider in RewriteEvent already.
+ // If no gesture is registered before the tap timer times out, the state
+ // will change to wait for no fingers down and this function will stop
+ // being called.
+ if (current_touch_ids_.size() == 0) {
+ ResetToNoFingersDown();
}
- ProcessGestureEvents();
return ui::EVENT_REWRITE_DISCARD;
}
ui::EventRewriteStatus TouchExplorationController::InOneFingerPassthrough(
const ui::TouchEvent& event,
scoped_ptr<ui::Event>* rewritten_event) {
- ui::EventType type = event.type();
-
- if (!(type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED ||
- type == ui::ET_TOUCH_MOVED || type == ui::ET_TOUCH_PRESSED)) {
- NOTREACHED() << "Unexpected event type received: " << event.name();
- return ui::EVENT_REWRITE_CONTINUE;
- }
if (event.touch_id() != initial_press_->touch_id()) {
if (current_touch_ids_.size() == 0) {
ResetToNoFingersDown();
@@ -420,7 +419,6 @@ ui::EventRewriteStatus TouchExplorationController::InOneFingerPassthrough(
if (current_touch_ids_.size() == 0) {
ResetToNoFingersDown();
}
-
return ui::EVENT_REWRITE_REWRITTEN;
}
@@ -462,27 +460,15 @@ ui::EventRewriteStatus TouchExplorationController::InTouchExploreSecondPress(
VLOG_STATE();
return ui::EVENT_REWRITE_REWRITTEN;
}
- NOTREACHED() << "Unexpected event type received: " << event.name();
+ NOTREACHED();
return ui::EVENT_REWRITE_CONTINUE;
}
-ui::EventRewriteStatus TouchExplorationController::InWaitForOneFinger(
+ui::EventRewriteStatus TouchExplorationController::InWaitForNoFingers(
const ui::TouchEvent& event,
scoped_ptr<ui::Event>* rewritten_event) {
- ui::EventType type = event.type();
- if (!(type == ui::ET_TOUCH_PRESSED || type == ui::ET_TOUCH_MOVED ||
- type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED)) {
- NOTREACHED() << "Unexpected event type received: " << event.name();
- return ui::EVENT_REWRITE_CONTINUE;
- }
- if (current_touch_ids_.size() == 1) {
- EnterTouchToMouseMode();
- state_ = TOUCH_EXPLORATION;
- VLOG_STATE();
- *rewritten_event = CreateMouseMoveEvent(event.location(), event.flags());
- last_touch_exploration_.reset(new TouchEvent(event));
- return ui::EVENT_REWRITE_REWRITTEN;
- }
+ if (current_touch_ids_.size() == 0)
+ ResetToNoFingersDown();
return EVENT_REWRITE_DISCARD;
}
@@ -494,8 +480,7 @@ ui::EventRewriteStatus TouchExplorationController::InSlideGesture(
const ui::TouchEvent& event,
scoped_ptr<ui::Event>* rewritten_event) {
// The timer should not fire when sliding.
- if (tap_timer_.IsRunning())
- tap_timer_.Stop();
+ tap_timer_.Stop();
ui::EventType type = event.type();
// If additional fingers are added before a swipe gesture has been registered,
@@ -504,12 +489,15 @@ ui::EventRewriteStatus TouchExplorationController::InSlideGesture(
event.touch_id() != initial_press_->touch_id()) {
if (sound_timer_.IsRunning())
sound_timer_.Stop();
- // Discard any pending gestures.
- delete gesture_provider_.GetAndResetPendingGestures();
- state_ = WAIT_FOR_ONE_FINGER;
+ state_ = WAIT_FOR_NO_FINGERS;
+ VLOG_STATE();
return EVENT_REWRITE_DISCARD;
}
+ // There should not be more than one finger down.
+ DCHECK(current_touch_ids_.size() <= 1);
+
+
// Allows user to return to the edge to adjust the sound if they have left the
// boundaries.
int edge = FindEdgesWithinBounds(event.location(), kSlopDistanceFromEdge);
@@ -530,23 +518,10 @@ ui::EventRewriteStatus TouchExplorationController::InSlideGesture(
delegate_->PlayVolumeAdjustSound();
}
- // 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);
- delete gesture_provider_.GetAndResetPendingGestures();
- if (current_touch_ids_.size() == 0) {
- ResetToNoFingersDown();
- }
- return ui::EVENT_REWRITE_DISCARD;
+ if (current_touch_ids_.size() == 0) {
+ ResetToNoFingersDown();
}
- ProcessGestureEvents();
return ui::EVENT_REWRITE_DISCARD;
}
@@ -590,13 +565,21 @@ void TouchExplorationController::OnTapTimerFired() {
return;
}
case SINGLE_TAP_PRESSED:
- case GESTURE_IN_PROGRESS:
- // Discard any pending gestures.
- delete gesture_provider_.GetAndResetPendingGestures();
EnterTouchToMouseMode();
state_ = TOUCH_EXPLORATION;
- VLOG_STATE();
break;
+ case GESTURE_IN_PROGRESS:
+ // If only one finger is down, go into touch exploration.
+ if (current_touch_ids_.size() == 1) {
+ EnterTouchToMouseMode();
+ state_ = TOUCH_EXPLORATION;
+ VLOG_STATE();
+ return;
lisayin 2014/08/06 22:43:29 This should be a break so that the mouse moves can
evy 2014/08/06 22:59:14 Done.
+ }
+ // Otherwise wait for all fingers to be lifted.
+ state_ = WAIT_FOR_NO_FINGERS;
+ VLOG_STATE();
+ return;
default:
return;
}
@@ -615,40 +598,41 @@ void TouchExplorationController::DispatchEvent(ui::Event* event) {
root_window_->GetHost()->dispatcher()->OnEventFromSource(event);
}
-void TouchExplorationController::OnGestureEvent(
- ui::GestureEvent* gesture) {
- CHECK(gesture->IsGestureEvent());
- ui::EventType type = gesture->type();
- if (VLOG_on_)
- VLOG(0) << " \n Gesture Triggered: " << gesture->name();
- if (type == ui::ET_GESTURE_SWIPE && state_ != SLIDE_GESTURE) {
- if (VLOG_on_)
- VLOG(0) << "Swipe!";
- delete gesture_provider_.GetAndResetPendingGestures();
- OnSwipeEvent(gesture);
- return;
- }
+// This is an override. We're using other more specific functions for possible
+// processed gesture events.
+void TouchExplorationController::OnGestureEvent(ui::GestureEvent* gesture) {
}
void TouchExplorationController::ProcessGestureEvents() {
scoped_ptr<ScopedVector<ui::GestureEvent> > gestures(
- gesture_provider_.GetAndResetPendingGestures());
+ gesture_provider_->GetAndResetPendingGestures());
if (gestures) {
for (ScopedVector<GestureEvent>::iterator i = gestures->begin();
i != gestures->end();
++i) {
- if (state_ == SLIDE_GESTURE)
+ if ((*i)->type() == ui::ET_GESTURE_SWIPE &&
+ state_ == GESTURE_IN_PROGRESS) {
+ OnSwipeEvent(*i);
+ // The tap timer to leave gesture state is ended, and we now wait for
+ // all
+ // fingers to be released.
lisayin 2014/08/06 22:43:29 nit: move this line to the line with // all
evy 2014/08/06 22:59:14 Done.
+ tap_timer_.Stop();
+ state_ = WAIT_FOR_NO_FINGERS;
+ VLOG_STATE();
+ return;
+ }
+ if (state_ == SLIDE_GESTURE && (*i)->IsScrollGestureEvent()) {
SideSlideControl(*i);
- else
- OnGestureEvent(*i);
+ return;
+ }
}
}
}
void TouchExplorationController::SideSlideControl(ui::GestureEvent* gesture) {
ui::EventType type = gesture->type();
- if (!gesture->IsScrollGestureEvent())
- return;
+ CHECK(gesture->IsGestureEvent());
+ CHECK(gesture->IsScrollGestureEvent());
if (type == ET_GESTURE_SCROLL_BEGIN) {
delegate_->PlayVolumeAdjustSound();
@@ -693,24 +677,28 @@ void TouchExplorationController::SideSlideControl(ui::GestureEvent* gesture) {
delegate_->SetOutputLevel(int(volume));
}
-
void TouchExplorationController::OnSwipeEvent(ui::GestureEvent* swipe_gesture) {
// A swipe gesture contains details for the direction in which the swipe
- // occurred.
+ // occurred. TODO(evy) : Research which swipe results users most want and
+ // remap these swipes to the best events. Hopefully in the near future
+ // there will also be a menu for users to pick custom mappings.
+ CHECK(swipe_gesture->IsGestureEvent());
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);
+ int num_fingers = event_details.touch_points();
+ if(VLOG_on_)
+ VLOG(0) << "\nSwipe with " << num_fingers << " fingers.";
+
+ if (num_fingers > 4)
return;
- }
+
+ if (event_details.swipe_left())
+ left_swipe_gestures_[num_fingers].Run();
+ else if (event_details.swipe_right())
+ right_swipe_gestures_[num_fingers].Run();
+ else if (event_details.swipe_up())
+ up_swipe_gestures_[num_fingers].Run();
+ else if (event_details.swipe_down())
+ down_swipe_gestures_[num_fingers].Run();
}
int TouchExplorationController::FindEdgesWithinBounds(gfx::Point point,
@@ -742,32 +730,45 @@ int TouchExplorationController::FindEdgesWithinBounds(gfx::Point point,
}
void TouchExplorationController::DispatchShiftSearchKeyEvent(
- const ui::KeyboardCode direction) {
- // In order to activate the shortcut shift+search+<arrow key>
+ const ui::KeyboardCode third_key) {
+ // In order to activate the shortcut shift+search+<key>
// three KeyPressed events must be dispatched in succession along
// with three KeyReleased events.
- ui::KeyEvent shift_down = ui::KeyEvent(
+
+ ui::KeyEvent shift_down(
ui::ET_KEY_PRESSED, ui::VKEY_SHIFT, ui::EF_SHIFT_DOWN);
- ui::KeyEvent search_down = ui::KeyEvent(
+ ui::KeyEvent search_down(
ui::ET_KEY_PRESSED, kChromeOSSearchKey, ui::EF_SHIFT_DOWN);
- ui::KeyEvent direction_down =
- ui::KeyEvent(ui::ET_KEY_PRESSED, direction, ui::EF_SHIFT_DOWN);
+ ui::KeyEvent third_key_down(ui::ET_KEY_PRESSED, third_key, ui::EF_SHIFT_DOWN);
- ui::KeyEvent direction_up =
- ui::KeyEvent(ui::ET_KEY_RELEASED, direction, ui::EF_SHIFT_DOWN);
- ui::KeyEvent search_up = ui::KeyEvent(
+ ui::KeyEvent third_key_up(ui::ET_KEY_RELEASED, third_key, ui::EF_SHIFT_DOWN);
+ ui::KeyEvent search_up(
ui::ET_KEY_RELEASED, kChromeOSSearchKey, ui::EF_SHIFT_DOWN);
- ui::KeyEvent shift_up =
- ui::KeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_SHIFT, ui::EF_NONE);
+ ui ::KeyEvent shift_up(ui::ET_KEY_RELEASED, ui::VKEY_SHIFT, ui::EF_NONE);
DispatchEvent(&shift_down);
DispatchEvent(&search_down);
- DispatchEvent(&direction_down);
- DispatchEvent(&direction_up);
+ DispatchEvent(&third_key_down);
+ DispatchEvent(&third_key_up);
DispatchEvent(&search_up);
DispatchEvent(&shift_up);
}
+void TouchExplorationController::DispatchKeyWithFlags(
+ const ui::KeyboardCode key,
+ int flags) {
+ ui::KeyEvent key_down(ui::ET_KEY_PRESSED, key, flags);
+ ui::KeyEvent key_up(ui::ET_KEY_RELEASED, key, flags);
+ DispatchEvent(&key_down);
+ DispatchEvent(&key_up);
+ if(VLOG_on_) {
+ VLOG(0) << "\nKey down: key code : " << key_down.key_code()
+ << ", flags: " << key_down.flags()
+ << "\nKey up: key code : " << key_up.key_code()
+ << ", flags: " << key_up.flags();
+ }
+}
+
scoped_ptr<ui::Event> TouchExplorationController::CreateMouseMoveEvent(
const gfx::PointF& location,
int flags) {
@@ -804,13 +805,12 @@ void TouchExplorationController::EnterTouchToMouseMode() {
}
void TouchExplorationController::ResetToNoFingersDown() {
- ProcessGestureEvents();
+ gesture_provider_.reset(new GestureProviderAura(this));
if (sound_timer_.IsRunning())
sound_timer_.Stop();
state_ = NO_FINGERS_DOWN;
VLOG_STATE();
- if (tap_timer_.IsRunning())
- tap_timer_.Stop();
+ tap_timer_.Stop();
}
void TouchExplorationController::VlogState(const char* function_name) {
@@ -843,6 +843,7 @@ void TouchExplorationController::VlogEvent(const ui::TouchEvent& touch_event,
touch_event.type() == ET_TOUCH_MOVED){
return;
}
+
const std::string& type = touch_event.name();
const gfx::PointF& location = touch_event.location_f();
const int touch_id = touch_event.touch_id();
@@ -874,14 +875,104 @@ const char* TouchExplorationController::EnumStateToString(State state) {
return "GESTURE_IN_PROGRESS";
case TOUCH_EXPLORE_SECOND_PRESS:
return "TOUCH_EXPLORE_SECOND_PRESS";
- case SLIDE_GESTURE:
- return "SLIDE_GESTURE";
case ONE_FINGER_PASSTHROUGH:
return "ONE_FINGER_PASSTHROUGH";
- case WAIT_FOR_ONE_FINGER:
- return "WAIT_FOR_ONE_FINGER";
+ case WAIT_FOR_NO_FINGERS:
+ return "WAIT_FOR_NO_FINGERS";
+ case SLIDE_GESTURE:
+ return "SLIDE_GESTURE";
}
return "Not a state";
}
+void TouchExplorationController::InitializeSwipeGestureMaps() {
+ // Gestures with one finger are used for navigation.
+ left_swipe_gestures_[1] =
+ base::Bind(&TouchExplorationController::DispatchShiftSearchKeyEvent,
+ base::Unretained(this),
+ ui::VKEY_LEFT);
+ right_swipe_gestures_[1] =
+ base::Bind(&TouchExplorationController::DispatchShiftSearchKeyEvent,
+ base::Unretained(this),
+ ui::VKEY_RIGHT);
+ up_swipe_gestures_[1] =
+ base::Bind(&TouchExplorationController::DispatchShiftSearchKeyEvent,
+ base::Unretained(this),
+ ui::VKEY_UP);
+ down_swipe_gestures_[1] =
+ base::Bind(&TouchExplorationController::DispatchShiftSearchKeyEvent,
+ base::Unretained(this),
+ ui::VKEY_DOWN);
+
+ // Gestures with two fingers.
+ left_swipe_gestures_[2] =
+ base::Bind(&TouchExplorationController::DispatchKeyWithFlags,
+ base::Unretained(this),
+ ui::VKEY_BROWSER_BACK,
+ ui::EF_NONE);
+ right_swipe_gestures_[2] =
+ base::Bind(&TouchExplorationController::DispatchKeyWithFlags,
+ base::Unretained(this),
+ ui::VKEY_BROWSER_FORWARD,
+ ui::EF_NONE);
+ // Jump to top.
+ up_swipe_gestures_[2] =
+ base::Bind(&TouchExplorationController::DispatchShiftSearchKeyEvent,
+ base::Unretained(this),
+ ui::VKEY_A);
+ // Read from here.
+ down_swipe_gestures_[2] =
+ base::Bind(&TouchExplorationController::DispatchShiftSearchKeyEvent,
+ base::Unretained(this),
+ ui::VKEY_R);
+
+ // Gestures with three fingers switch tabs left/right and scroll up/down.
+ left_swipe_gestures_[3] =
+ base::Bind(&TouchExplorationController::DispatchKeyWithFlags,
+ base::Unretained(this),
+ ui::VKEY_TAB,
+ ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN);
+ right_swipe_gestures_[3] =
+ base::Bind(&TouchExplorationController::DispatchKeyWithFlags,
+ base::Unretained(this),
+ ui::VKEY_TAB,
+ ui::EF_CONTROL_DOWN);
+ up_swipe_gestures_[3] =
+ base::Bind(&TouchExplorationController::DispatchKeyWithFlags,
+ base::Unretained(this),
+ ui::VKEY_NEXT,
+ ui::EF_NONE);
+ down_swipe_gestures_[3] =
+ base::Bind(&TouchExplorationController::DispatchKeyWithFlags,
+ base::Unretained(this),
+ ui::VKEY_PRIOR,
+ ui::EF_NONE);
+
+ // Gestures with four fingers should probably eventually be used for rare
+ // needs that are hard to access through menus.
+ // Note that brightness levels are here because they can be important for low
+ // vision users. However, none of these mappings are permanent.
+ left_swipe_gestures_[4] =
+ base::Bind(&TouchExplorationController::DispatchKeyWithFlags,
+ base::Unretained(this),
+ ui::VKEY_BRIGHTNESS_DOWN,
+ ui::EF_NONE);
+ right_swipe_gestures_[4] =
+ base::Bind(&TouchExplorationController::DispatchKeyWithFlags,
+ base::Unretained(this),
+ VKEY_BRIGHTNESS_UP,
+ ui::EF_NONE);
+ up_swipe_gestures_[4] =
+ base::Bind(&TouchExplorationController::DispatchKeyWithFlags,
+ base::Unretained(this),
+ VKEY_BROWSER_HOME,
+ ui::EF_NONE);
+ down_swipe_gestures_[4] =
+ base::Bind(&TouchExplorationController::DispatchKeyWithFlags,
+ base::Unretained(this),
+ VKEY_BROWSER_REFRESH,
+ ui::EF_NONE);
+
+}
+
} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698