| OLD | NEW | 
| (Empty) |  | 
 |    1 // Copyright 2015 The Chromium Authors. All rights reserved. | 
 |    2 // Use of this source code is governed by a BSD-style license that can be | 
 |    3 // found in the LICENSE file. | 
 |    4  | 
 |    5 #ifndef SERVICES_VIEW_MANAGER_GESTURE_MANAGER_H_ | 
 |    6 #define SERVICES_VIEW_MANAGER_GESTURE_MANAGER_H_ | 
 |    7  | 
 |    8 #include <map> | 
 |    9 #include <set> | 
 |   10  | 
 |   11 #include "base/memory/scoped_ptr.h" | 
 |   12 #include "base/memory/scoped_vector.h" | 
 |   13  | 
 |   14 namespace mojo { | 
 |   15 class Event; | 
 |   16 } | 
 |   17  | 
 |   18 namespace view_manager { | 
 |   19  | 
 |   20 class GestureManagerDelegate; | 
 |   21 class GestureManagerTest; | 
 |   22 class ServerView; | 
 |   23  | 
 |   24 struct GestureStateChange { | 
 |   25   GestureStateChange(); | 
 |   26   ~GestureStateChange(); | 
 |   27  | 
 |   28   uint32_t chosen_gesture; | 
 |   29   std::set<uint32_t> canceled_gestures; | 
 |   30 }; | 
 |   31  | 
 |   32 using ChangeMap = std::map<const ServerView*, GestureStateChange>; | 
 |   33  | 
 |   34 // GestureManager handles incoming pointer events. It determines the set of | 
 |   35 // views (at most one per connection) that are interested in the event and | 
 |   36 // informs the delegate at the appropriate time. | 
 |   37 // | 
 |   38 // Each pointer may have any number of views associated with it, and each view | 
 |   39 // may have any number of gestures associated with it. Gesture are identified | 
 |   40 // the by the pair of the connection id of the view and the client supplied | 
 |   41 // gesture.  The same gesture may be used in multiple pointers (see example | 
 |   42 // below). | 
 |   43 // | 
 |   44 // Gestures have the following states: | 
 |   45 // . initial: Initial state for new gestures. From this state the gesture may | 
 |   46 //   become chosen or canceled. Once a gesture moves out of this state it can | 
 |   47 //   never go back. | 
 |   48 // . chosen: the gesture has been chosen. From this state the gesture may be | 
 |   49 //   canceled. | 
 |   50 // . canceled: the gesture has been canceled. | 
 |   51 // Gestures are active as long as they are included in the set of | 
 |   52 // |possible_gesture_ids|. Gestures can be removed at any time by removing the | 
 |   53 // gesture from |possible_gesture_ids|. | 
 |   54 // | 
 |   55 // A particular pointer has two distinct states: | 
 |   56 // . initial: none of the gestures associated with the pointer have been | 
 |   57 //   chosen. | 
 |   58 // . chosen: when a gesture associated with the pointer has been chosen. | 
 |   59 // Pointers are removed when a POINTER_UP or POINTER_CANCEL event is received. | 
 |   60 // | 
 |   61 // When a pointer is chosen all other gestures associated with the pointer are | 
 |   62 // implicitly canceled. If the chosen gesture is canceled the pointer remains | 
 |   63 // in the chosen state and no gestures can be chosen. | 
 |   64 // | 
 |   65 // Event propagation (ProcessEvent()) is handled in two distinct ways: | 
 |   66 // . Until a gesture has been chosen for the pointer, views are notified in | 
 |   67 //   order (deepest first). The next view (ancestor) is notified once | 
 |   68 //   SetGestures() has been invoked for the previous (descendant) view. | 
 |   69 // . Once a gesture has been chosen, then incoming events are immediately | 
 |   70 //   dispatched. | 
 |   71 // | 
 |   72 // The following example highlights various states and transitions: | 
 |   73 // . A POINTER_DOWN event is received for the pointer p1. The views that | 
 |   74 //   contain the location of the event (starting with the deepest) are v1, v2, | 
 |   75 //   v3 and v4. Both v1 and v2 have the property kViewManagerKeyWantsTouchEvents | 
 |   76 //   set, so only v1 and v2 are considered. v1 is the deepest view, so the | 
 |   77 //   touch event is set to it and only it first. | 
 |   78 // . v1 responds with possible gestures g1 and g2. v1 does not specify either | 
 |   79 //   of the gestures as chosen. | 
 |   80 // . As the response from v1 has been received and there is no chosen gesture | 
 |   81 //   the POINTER_DOWN event is sent to v2. | 
 |   82 // . v2 responds with gestures g3 and g4, neither of which are chosen. | 
 |   83 // . A POINTER_MOVE for p1 is received. As no gestures have been chosen event | 
 |   84 //   of the POINTER_MOVE continues with v1 first. | 
 |   85 // . v1 returns g1 and g2 as possible gestures and does not choose one. | 
 |   86 // . The POINTER_MOVE is sent to v2. | 
 |   87 // . v2 returns g3 and g4 as possible gestures and does not choose one. | 
 |   88 // At this point p1 has the possible gestures g1, g2, g3, g4. Gestures g1 and | 
 |   89 // g2 are associated with v1. Gestures g3 and g4 are associated with v2. | 
 |   90 // . A POINTER_DOWN event is received for the pointer p2. v1 and v2 again | 
 |   91 //   contain the location of the pointer. v1 is handed the event first. | 
 |   92 // . A POINTER_MOVE event is received for the pointer p2. As the response from | 
 |   93 //   v1 has not been received yet, the event is not sent yet (it is queued up). | 
 |   94 // . v1 responds to the POINTER_DOWN for p2 with g1 and g2 and chooses g1. | 
 |   95 // At this point g2, g3 and g4 are all canceled with g1 chosen. p2 is in the | 
 |   96 // chosen state, as is p1 (p1 enters the chosen state as it contains the chosen | 
 |   97 // gesture as well). | 
 |   98 // . The POINTER_DOWN event for p2 is sent to v2. As p2 is in the chosen state | 
 |   99 //   the POINTER_MOVE event that was queued up is sent to both v1 and v2 at the | 
 |  100 //   same time (no waiting for response). | 
 |  101 // | 
 |  102 // TODO(sky): add some sort of timeout to deal with hung processes. | 
 |  103 class GestureManager { | 
 |  104  public: | 
 |  105   using GestureAndConnectionId = uint64_t; | 
 |  106  | 
 |  107   static const uint32_t kInvalidGestureId; | 
 |  108  | 
 |  109   GestureManager(GestureManagerDelegate* delegate, const ServerView* root); | 
 |  110   ~GestureManager(); | 
 |  111  | 
 |  112   // Processes the current event. See GestureManager description for details. | 
 |  113   bool ProcessEvent(const mojo::Event& event); | 
 |  114  | 
 |  115   // Sets the gestures for the specified view and pointer. | 
 |  116   scoped_ptr<ChangeMap> SetGestures( | 
 |  117       const ServerView* view, | 
 |  118       int32_t pointer_id, | 
 |  119       uint32_t chosen_gesture_id, | 
 |  120       const std::set<uint32_t>& possible_gesture_ids, | 
 |  121       const std::set<uint32_t>& canceled_gesture_ids); | 
 |  122  | 
 |  123  private: | 
 |  124   friend class GestureManagerTest; | 
 |  125  | 
 |  126   class Gesture; | 
 |  127   class Pointer; | 
 |  128   struct PointerAndView; | 
 |  129   class ScheduledDeleteProcessor; | 
 |  130  | 
 |  131   // Returns the Pointer for |pointer_id|, or null if one doesn't exist. | 
 |  132   Pointer* GetPointerById(int32_t pointer_id); | 
 |  133  | 
 |  134   // Notification that |pointer| has no gestures. This deletes |pointer|. | 
 |  135   void PointerHasNoGestures(Pointer* pointer); | 
 |  136  | 
 |  137   // Returns the Gesture for the specified arguments, creating if necessary. | 
 |  138   Gesture* GetGesture(const ServerView* view, uint32_t gesture_id); | 
 |  139  | 
 |  140   // Called from Pointer when a gesture is associated with a pointer. | 
 |  141   void AttachGesture(Gesture* gesture, | 
 |  142                      Pointer* pointer, | 
 |  143                      const ServerView* view); | 
 |  144  | 
 |  145   // Called from Pointer when a gesture is no longer associated with a | 
 |  146   // pointer. | 
 |  147   void DetachGesture(Gesture* gesture, | 
 |  148                      Pointer* pointer, | 
 |  149                      const ServerView* view); | 
 |  150  | 
 |  151   // Cancels the supplied gesture (if it isn't canceled already). Notifies all | 
 |  152   // pointers containing |gesture| that |gesture| has been canceled. | 
 |  153   void CancelGesture(Gesture* gesture, | 
 |  154                      Pointer* pointer, | 
 |  155                      const ServerView* view); | 
 |  156  | 
 |  157   // Chooses the supplied gesture. Notifies all pointers containing |gesture| | 
 |  158   // that |gesture| has been chosen. | 
 |  159   void ChooseGesture(Gesture* gesture, | 
 |  160                      Pointer* pointer, | 
 |  161                      const ServerView* view); | 
 |  162  | 
 |  163   // Deletes |pointer| after processing the current event. We delay deletion | 
 |  164   // until after the event as immediate deletion can cause problems for Pointer | 
 |  165   // (this is because the same Pointer may be on multiple frames of the stack). | 
 |  166   void ScheduleDelete(Pointer* pointer); | 
 |  167  | 
 |  168   GestureManagerDelegate* delegate_; | 
 |  169   const ServerView* root_view_; | 
 |  170  | 
 |  171   // Map for looking up gestures. Gestures are identified by the pair of | 
 |  172   // connection id and supplied gesture id. | 
 |  173   std::map<GestureAndConnectionId, Gesture*> gesture_map_; | 
 |  174  | 
 |  175   ScopedVector<Pointer> active_pointers_; | 
 |  176  | 
 |  177   // See comment in ScheduleDelete() for details. | 
 |  178   ScopedVector<Pointer> pointers_to_delete_; | 
 |  179  | 
 |  180   // Accumulates changes as the result of SetGestures(). | 
 |  181   scoped_ptr<ChangeMap> current_change_; | 
 |  182  | 
 |  183   DISALLOW_COPY_AND_ASSIGN(GestureManager); | 
 |  184 }; | 
 |  185  | 
 |  186 }  // namespace view_manager | 
 |  187  | 
 |  188 #endif  // SERVICES_VIEW_MANAGER_GESTURE_MANAGER_H_ | 
| OLD | NEW |