Index: ui/chromeos/touch_exploration_controller.h |
diff --git a/ui/chromeos/touch_exploration_controller.h b/ui/chromeos/touch_exploration_controller.h |
index 99aa7c10eedf66f2963742bbdc3da8278e3e49b6..a553ec6e4a3fe062769097232f68b3f2619c7c18 100644 |
--- a/ui/chromeos/touch_exploration_controller.h |
+++ b/ui/chromeos/touch_exploration_controller.h |
@@ -106,7 +106,8 @@ class TouchExplorationControllerDelegate { |
// if the user releases their finger and taps before 300 ms passes. |
// This will result in a click on the last successful touch exploration |
// location. This allows the user to perform a single tap |
-// anywhere to activate it. |
+// anywhere to activate it. (See more information on simulated clicks |
+// below.) |
// |
// The user can perform swipe gestures in one of the four cardinal directions |
// which will be interpreted and used to control the UI. All gestures will only |
@@ -117,20 +118,26 @@ class TouchExplorationControllerDelegate { |
// completed within the grace period, the user must lift all fingers before |
// completing any more actions. |
// |
-// If the user double-taps, the second tap is passed through, allowing the |
-// user to click - however, the double-tap location is changed to the location |
-// of the last successful touch exploration - that allows the user to explore |
-// anywhere on the screen, hear its description, then double-tap anywhere |
-// to activate it. |
+// The user's initial tap sets the anchor point. Simulated events are |
+// positioned relative to the anchor point, so that after exploring to find |
+// an object the user can double-tap anywhere on the screen to activate it. |
+// The anchor point is also set by ChromeVox every time it highlights an |
+// object on the screen. During touch exploration this ensures that |
+// any simulated events go to the center of the most recently highlighted |
+// object, rather than to the exact tap location (which could have drifted |
+// off of the object). This also ensures that when the current ChromeVox |
+// object changes due to a gesture or input focus changing, simulated |
+// events go to that object and not the last location touched by a finger. |
// |
-// If the user double taps and holds, any event from that finger is passed |
-// through. These events are passed through with an offset such that the first |
-// touch is offset to be at the location of the last touch exploration |
-// location, and every following event is offset by the same amount. |
+// When the user double-taps, this is treated as a discrete gestures, and |
+// and event is sent to ChromeVox to activate the current object, whatever |
+// that is. However, when the user double-taps and holds, any event from that |
+// finger is passed through, allowing the user to drag. These events are |
+// passed through with a location that's relative to the anchor point. |
// |
-// If any other fingers are added or removed, they are ignored. Once the |
-// passthrough finger is released, passthrough stops and the user is reset |
-// to no fingers down state. |
+// If any other fingers are added or removed during a passthrough, they are |
+// ignored. Once the passthrough finger is released, passthrough stops and |
+// the state is reset to the no fingers down state. |
// |
// If the user enters touch exploration mode, they can click without lifting |
// their touch exploration finger by tapping anywhere else on the screen with |
@@ -178,6 +185,11 @@ class UI_CHROMEOS_EXPORT TouchExplorationController |
ui::TouchExplorationControllerDelegate* delegate); |
~TouchExplorationController() override; |
+ // Make synthesized touch events are anchored at this point. This is |
+ // called when the object with accessibility focus is updated via something |
+ // other than touch exploration. |
+ void SetTouchAccessibilityAnchorPoint(const gfx::Point& anchor_point); |
+ |
private: |
friend class TouchExplorationControllerTestApi; |
@@ -280,6 +292,8 @@ class UI_CHROMEOS_EXPORT TouchExplorationController |
void PlaySoundForTimer(); |
+ void SendSimulatedClick(); |
+ |
// Some constants used in touch_exploration_controller: |
// Within this many dips of the screen edge, the release event generated will |
@@ -384,6 +398,12 @@ class UI_CHROMEOS_EXPORT TouchExplorationController |
TWO_FINGER_TAP, |
}; |
+ enum AnchorPointState { |
+ ANCHOR_POINT_NONE, |
+ ANCHOR_POINT_FROM_TOUCH_EXPLORATION, |
+ ANCHOR_POINT_EXPLICITLY_SET |
+ }; |
+ |
enum ScreenLocation { |
// Hot "edges" of the screen are each represented by a respective bit. |
NO_EDGE = 0, |
@@ -442,8 +462,18 @@ class UI_CHROMEOS_EXPORT TouchExplorationController |
// enters double-tap-hold passthrough, we need to update its location.) |
std::unique_ptr<ui::TouchEvent> last_unused_finger_event_; |
- // The last synthesized mouse move event. When the user double-taps, |
- // we send the passed-through tap to the location of this event. |
+ // The anchor point used as the location of a synthesized tap when the |
+ // user double-taps anywhere on the screen, and similarly the initial |
+ // point used when the user double-taps, holds, and drags. This can be |
+ // set either via touch exploration, or by a call to |
+ // SetTouchAccessibilityAnchorPoint when focus moves due to something other |
+ // than touch exploration. |
+ gfx::PointF anchor_point_; |
+ |
+ // The current state of the anchor point. |
+ AnchorPointState anchor_point_state_; |
+ |
+ // The last touch exploration event. |
std::unique_ptr<ui::TouchEvent> last_touch_exploration_; |
// A timer that fires after the double-tap delay. |