| 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);
|
| };
|
|
|
|
|