Index: components/mus/ws/event_dispatcher.h |
diff --git a/components/mus/ws/event_dispatcher.h b/components/mus/ws/event_dispatcher.h |
index c24fac42484bf5eaf59cb8ed19e2c812b632b99f..3306eaa88901558f8ce8d1d71cf8cc8cb3fb5b97 100644 |
--- a/components/mus/ws/event_dispatcher.h |
+++ b/components/mus/ws/event_dispatcher.h |
@@ -9,6 +9,7 @@ |
#include "base/memory/scoped_ptr.h" |
#include "cc/surfaces/surface_id.h" |
+#include "components/mus/ws/server_window_observer.h" |
#include "ui/gfx/geometry/rect_f.h" |
#include "ui/mojo/events/input_event_constants.mojom.h" |
#include "ui/mojo/events/input_event_matcher.mojom.h" |
@@ -23,7 +24,7 @@ class EventMatcher; |
class ServerWindow; |
// Handles dispatching events to the right location as well as updating focus. |
-class EventDispatcher { |
+class EventDispatcher : public ServerWindowObserver { |
public: |
explicit EventDispatcher(EventDispatcherDelegate* delegate); |
~EventDispatcher(); |
@@ -38,29 +39,66 @@ class EventDispatcher { |
void OnEvent(mojo::EventPtr event); |
private: |
+ // Keeps track of state associated with a pointer down until the |
+ // corresponding up/cancel. |
+ struct PointerTarget { |
+ PointerTarget() : window(nullptr), in_nonclient_area(false) {} |
+ |
+ // NOTE: this is set to null if the window is destroyed before a |
+ // corresponding release/cancel. |
+ ServerWindow* window; |
+ |
+ // Did the pointer event start in the non-client area. |
+ bool in_nonclient_area; |
+ }; |
+ |
+ void ProcessKeyEvent(mojo::EventPtr event); |
+ |
+ // EventDispatcher provides the following logic for pointer events: |
+ // . wheel events go to the current target of the associated pointer. If |
+ // there is no target, they go to the deepest window. |
+ // . move (not drag) events go to the deepest window. |
+ // . when a pointer goes down all events until the corresponding up or |
+ // cancel go to the deepest target. For mouse events the up only occurs |
+ // when no buttons on the mouse are down. |
+ void ProcessPointerEvent(mojo::EventPtr event); |
+ |
+ // If |target->window| is valid, then passes the event to the delegate. |
+ void DispatchToPointerTarget(const PointerTarget& target, |
+ mojo::EventPtr event); |
+ |
+ // Stops sending pointer events to |window|. This does not remove the entry |
+ // for |window| from |pointer_targets_|, rather it nulls out the window. This |
+ // way we continue to eat events until the up/cancel is received. |
+ void CancelPointerEventsToTarget(ServerWindow* window); |
+ |
+ // Returns true if any pointer events are being sent to |window|. |
+ bool IsSendingPointerEventsToTarget(ServerWindow* window); |
+ |
// Looks to see if there is an accelerator bound to the specified code/flags. |
// If there is one, sets |accelerator_id| to the id of the accelerator invoked |
// and returns true. If there is none, returns false so normal key event |
// processing can continue. |
bool FindAccelerator(const mojo::Event& event, uint32_t* accelerator_id); |
- // Returns the ServerWindow that should receive |event|. If |event| is a |
- // pointer-type event, then this function also updates the event location to |
- // make sure it is in the returned target's coordinate space. |
- ServerWindow* FindEventTarget(mojo::Event* event); |
+ // ServerWindowObserver: |
+ void OnWillChangeWindowHierarchy(ServerWindow* window, |
+ ServerWindow* new_parent, |
+ ServerWindow* old_parent) override; |
+ void OnWindowVisibilityChanged(ServerWindow* window) override; |
+ void OnWindowDestroyed(ServerWindow* window) override; |
EventDispatcherDelegate* delegate_; |
ServerWindow* root_; |
cc::SurfaceId surface_id_; |
- ServerWindow* capture_window_; |
- |
- // Was the capture the result of clicking in the non-client area? |
- bool capture_in_nonclient_area_; |
using Entry = std::pair<uint32_t, EventMatcher>; |
std::map<uint32_t, EventMatcher> accelerators_; |
+ using PointerIdToTargetMap = std::map<int32_t, PointerTarget>; |
+ PointerIdToTargetMap pointer_targets_; |
+ |
DISALLOW_COPY_AND_ASSIGN(EventDispatcher); |
}; |