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