1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef UI_AURA_WINDOW_EVENT_DISPATCHER_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define UI_AURA_WINDOW_EVENT_DISPATCHER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/gtest_prod_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/scoped_observer.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/aura_export.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/capture_delegate.h"
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/aura/env_observer.h"
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/aura/window_observer.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/cursor/cursor.h"
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h"
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/events/event_processor.h"
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/events/event_targeter.h"
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/gestures/gesture_recognizer.h"
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/gestures/gesture_types.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Size;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Transform;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GestureEvent;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GestureRecognizer;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class KeyEvent;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MouseEvent;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScrollEvent;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TouchEvent;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura {
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class TestScreen;
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class WindowTargeter;
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class WindowTreeHost;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace test {
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass WindowEventDispatcherTestApi;
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// WindowEventDispatcher orchestrates event dispatch within a window tree
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// owned by WindowTreeHost. WTH also owns the WED.
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(beng): In progress, remove functionality not directly related to
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//             event dispatch.
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AURA_EXPORT WindowEventDispatcher : public ui::EventProcessor,
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          public ui::GestureEventHelper,
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                          public client::CaptureDelegate,
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                          public WindowObserver,
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                          public EnvObserver {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit WindowEventDispatcher(WindowTreeHost* host);
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~WindowEventDispatcher();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Window* mouse_pressed_handler() { return mouse_pressed_handler_; }
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Window* mouse_moved_handler() { return mouse_moved_handler_; }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Repost event for re-processing. Used when exiting context menus.
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // We only support the ET_MOUSE_PRESSED and ET_GESTURE_TAP_DOWN event
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // types (although the latter is currently a no-op).
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RepostEvent(const ui::LocatedEvent& event);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Invoked when the mouse events get enabled or disabled.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnMouseEventsEnableStateChanged(bool enabled);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void DispatchCancelModeEvent();
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Dispatches a ui::ET_MOUSE_EXITED event at |point|.
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // TODO(beng): needed only for WTH::OnCursorVisibilityChanged().
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui::EventDispatchDetails DispatchMouseExitAtPoint(
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const gfx::Point& point) WARN_UNUSED_RESULT;
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gesture Recognition -------------------------------------------------------
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When a touch event is dispatched to a Window, it may want to process the
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // touch event asynchronously. In such cases, the window should consume the
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // event during the event dispatch. Once the event is properly processed, the
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // window should let the WindowEventDispatcher know about the result of the
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // event processing, so that gesture events can be properly created and
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // dispatched. |event|'s location should be in the dispatcher's coordinate
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // space, in DIPs.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ProcessedTouchEvent(ui::TouchEvent* event,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           Window* window,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ui::EventResult result);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // These methods are used to defer the processing of mouse/touch events
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // related to resize. A client (typically a RenderWidgetHostViewAura) can call
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // HoldPointerMoves when an resize is initiated and then ReleasePointerMoves
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // once the resize is completed.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // More than one hold can be invoked and each hold must be cancelled by a
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // release before we resume normal operation.
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void HoldPointerMoves();
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void ReleasePointerMoves();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the last location seen in a mouse event in this root window's
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // coordinates. This may return a point outside the root window's bounds.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point GetLastMouseLocationInRoot() const;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnHostLostMouseGrab();
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnCursorMovedToRootLocation(const gfx::Point& root_location);
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // TODO(beng): This is only needed because this cleanup needs to happen after
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //             all other observers are notified of OnWindowDestroying() but
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //             before OnWindowDestroyed() is sent (i.e. while the window
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //             hierarchy is still intact). This didn't seem worth adding a
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //             generic notification for as only this class needs to implement
119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //             it. I would however like to find a way to do this via an
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //             observer.
121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void OnPostNotifiedWindowDestroying(Window* window);
122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(WindowEventDispatcherTest,
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           KeepTranslatedEventInRoot);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  friend class test::WindowEventDispatcherTestApi;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class Window;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class TestScreen;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The parameter for OnWindowHidden() to specify why window is hidden.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum WindowHiddenReason {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WINDOW_DESTROYED,  // Window is destroyed.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WINDOW_HIDDEN,     // Window is hidden.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WINDOW_MOVING,     // Window is temporarily marked as hidden due to move
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       // across root windows.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  Window* window();
14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const Window* window() const;
14123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates the event with the appropriate transform for the device scale
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // factor. The WindowEventDispatcher dispatches events in the physical pixel
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // coordinate. But the event processing from WindowEventDispatcher onwards
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // happen in device-independent pixel coordinate. So it is necessary to update
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // the event received from the host.
1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void TransformEventForDeviceScaleFactor(ui::LocatedEvent* event);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Dispatches OnMouseExited to the |window| which is hiding if necessary.
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void DispatchMouseExitToHidingWindow(Window* window);
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Dispatches the specified event type (intended for enter/exit) to the
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |mouse_moved_handler_|.
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::EventDispatchDetails DispatchMouseEnterOrExit(
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const ui::MouseEvent& event,
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ui::EventType type) WARN_UNUSED_RESULT;
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::EventDispatchDetails ProcessGestures(
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ui::GestureRecognizer::Gestures* gestures) WARN_UNUSED_RESULT;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when a window becomes invisible, either by being removed
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // from root window hierarchy, via SetVisible(false) or being destroyed.
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |reason| specifies what triggered the hiding. Note that becoming invisible
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // will cause a window to lose capture and some windows may destroy themselves
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // on capture (like DragDropTracker).
1652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  void OnWindowHidden(Window* invisible, WindowHiddenReason reason);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns a target window for the given gesture event.
168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Window* GetGestureTarget(ui::GestureEvent* event);
169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Overridden from aura::client::CaptureDelegate:
1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void UpdateCapture(Window* old_capture, Window* new_capture) OVERRIDE;
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void OnOtherRootGotCapture() OVERRIDE;
1738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void SetNativeCapture() OVERRIDE;
1748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void ReleaseNativeCapture() OVERRIDE;
1758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Overridden from ui::EventProcessor:
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ui::EventTarget* GetRootTarget() OVERRIDE;
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void PrepareEventForDispatch(ui::Event* event) OVERRIDE;
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from ui::EventDispatcherDelegate.
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool CanDispatchToTarget(ui::EventTarget* target) OVERRIDE;
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ui::EventDispatchDetails PreDispatchEvent(ui::EventTarget* target,
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                    ui::Event* event) OVERRIDE;
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ui::EventDispatchDetails PostDispatchEvent(
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ui::EventTarget* target, const ui::Event& event) OVERRIDE;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ui::GestureEventHelper.
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual bool CanDispatchToConsumer(ui::GestureConsumer* consumer) OVERRIDE;
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void DispatchGestureEvent(ui::GestureEvent* event) OVERRIDE;
1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void DispatchCancelTouchEvent(ui::TouchEvent* event) OVERRIDE;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Overridden from WindowObserver:
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowDestroying(Window* window) OVERRIDE;
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowDestroyed(Window* window) OVERRIDE;
195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowAddedToRootWindow(Window* window) OVERRIDE;
196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowRemovingFromRootWindow(Window* window,
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                              Window* new_root) OVERRIDE;
198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowVisibilityChanging(Window* window,
199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                          bool visible) OVERRIDE;
200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowVisibilityChanged(Window* window, bool visible) OVERRIDE;
201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowBoundsChanged(Window* window,
202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     const gfx::Rect& old_bounds,
203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     const gfx::Rect& new_bounds) OVERRIDE;
204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowTransforming(Window* window) OVERRIDE;
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowTransformed(Window* window) OVERRIDE;
206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Overridden from EnvObserver:
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowInitialized(Window* window) OVERRIDE;
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // We hold and aggregate mouse drags and touch moves as a way of throttling
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // resizes when HoldMouseMoves() is called. The following methods are used to
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // dispatch held and newly incoming mouse and touch events, typically when an
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // event other than one of these needs dispatching or a matching
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // ReleaseMouseMoves()/ReleaseTouchMoves() is called.  NOTE: because these
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // methods dispatch events from WindowTreeHost the coordinates are in terms of
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the root.
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::EventDispatchDetails DispatchHeldEvents() WARN_UNUSED_RESULT;
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Posts a task to send synthesized mouse move event if there is no a pending
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // task.
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void PostSynthesizeMouseMove();
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Creates and dispatches synthesized mouse move event using the current mouse
2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // location.
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ui::EventDispatchDetails SynthesizeMouseMoveEvent() WARN_UNUSED_RESULT;
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Calls SynthesizeMouseMove() if |window| is currently visible and contains
228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // the mouse cursor.
229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void SynthesizeMouseMoveAfterChangeToWindow(Window* window);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void PreDispatchLocatedEvent(Window* target, ui::LocatedEvent* event);
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void PreDispatchMouseEvent(Window* target, ui::MouseEvent* event);
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void PreDispatchTouchEvent(Window* target, ui::TouchEvent* event);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WindowTreeHost* host_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Touch ids that are currently down.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 touch_ids_down_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Window* mouse_pressed_handler_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Window* mouse_moved_handler_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Window* event_dispatch_target_;
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Window* old_dispatch_target_;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool synthesize_mouse_move_;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // How many move holds are outstanding. We try to defer dispatching
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // touch/mouse moves while the count is > 0.
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int move_hold_count_;
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The location of |held_move_event_| is in |window_|'s coordinate.
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<ui::LocatedEvent> held_move_event_;
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allowing for reposting of events. Used when exiting context menus.
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<ui::LocatedEvent> held_repostable_event_;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Set when dispatching a held event.
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool dispatching_held_event_;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ScopedObserver<aura::Window, aura::WindowObserver> observer_manager_;
260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Used to schedule reposting an event.
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::WeakPtrFactory<WindowEventDispatcher> repost_event_factory_;
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Used to schedule DispatchHeldEvents() when |move_hold_count_| goes to 0.
265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::WeakPtrFactory<WindowEventDispatcher> held_event_factory_;
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WindowEventDispatcher);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace aura
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // UI_AURA_WINDOW_EVENT_DISPATCHER_H_
273