OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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 UI_AURA_ROOT_WINDOW_H_ | |
6 #define UI_AURA_ROOT_WINDOW_H_ | |
7 | |
8 #include <vector> | |
9 | |
10 #include "base/basictypes.h" | |
11 #include "base/gtest_prod_util.h" | |
12 #include "base/memory/ref_counted.h" | |
13 #include "base/memory/scoped_ptr.h" | |
14 #include "base/memory/weak_ptr.h" | |
15 #include "base/message_loop/message_loop.h" | |
16 #include "ui/aura/aura_export.h" | |
17 #include "ui/aura/client/capture_delegate.h" | |
18 #include "ui/aura/window_tree_host.h" | |
19 #include "ui/aura/window_tree_host_delegate.h" | |
20 #include "ui/base/cursor/cursor.h" | |
21 #include "ui/compositor/compositor.h" | |
22 #include "ui/compositor/layer_animation_observer.h" | |
23 #include "ui/events/event_constants.h" | |
24 #include "ui/events/event_processor.h" | |
25 #include "ui/events/event_targeter.h" | |
26 #include "ui/events/gestures/gesture_recognizer.h" | |
27 #include "ui/events/gestures/gesture_types.h" | |
28 #include "ui/gfx/native_widget_types.h" | |
29 #include "ui/gfx/point.h" | |
30 | |
31 namespace gfx { | |
32 class Size; | |
33 class Transform; | |
34 } | |
35 | |
36 namespace ui { | |
37 class GestureEvent; | |
38 class GestureRecognizer; | |
39 class KeyEvent; | |
40 class LayerAnimationSequence; | |
41 class MouseEvent; | |
42 class ScrollEvent; | |
43 class TouchEvent; | |
44 class ViewProp; | |
45 } | |
46 | |
47 namespace aura { | |
48 class WindowTreeHost; | |
49 class RootWindowObserver; | |
50 class TestScreen; | |
51 class WindowTargeter; | |
52 | |
53 // RootWindow is responsible for hosting a set of windows. | |
54 class AURA_EXPORT WindowEventDispatcher : public ui::EventProcessor, | |
55 public ui::GestureEventHelper, | |
56 public ui::LayerAnimationObserver, | |
57 public client::CaptureDelegate, | |
58 public WindowTreeHostDelegate { | |
59 public: | |
60 struct AURA_EXPORT CreateParams { | |
61 // CreateParams with initial_bounds and default host in pixel. | |
62 explicit CreateParams(const gfx::Rect& initial_bounds); | |
63 ~CreateParams() {} | |
64 | |
65 gfx::Rect initial_bounds; | |
66 | |
67 // A host to use in place of the default one that RootWindow will create. | |
68 // NULL by default. | |
69 WindowTreeHost* host; | |
70 }; | |
71 | |
72 explicit WindowEventDispatcher(const CreateParams& params); | |
73 virtual ~WindowEventDispatcher(); | |
74 | |
75 // Returns the WindowTreeHost for the specified accelerated widget, or NULL | |
76 // if there is none associated. | |
77 static WindowEventDispatcher* GetForAcceleratedWidget( | |
78 gfx::AcceleratedWidget widget); | |
79 | |
80 Window* window() { | |
81 return const_cast<Window*>( | |
82 const_cast<const WindowEventDispatcher*>(this)->window()); | |
83 } | |
84 const Window* window() const { return window_.get(); } | |
85 WindowTreeHost* host() { | |
86 return const_cast<WindowTreeHost*>( | |
87 const_cast<const WindowEventDispatcher*>(this)->host()); | |
88 } | |
89 const WindowTreeHost* host() const { return host_.get(); } | |
90 Window* mouse_pressed_handler() { return mouse_pressed_handler_; } | |
91 Window* mouse_moved_handler() { return mouse_moved_handler_; } | |
92 | |
93 // Stop listening events in preparation for shutdown. | |
94 void PrepareForShutdown(); | |
95 | |
96 // Repost event for re-processing. Used when exiting context menus. | |
97 // We only support the ET_MOUSE_PRESSED and ET_GESTURE_TAP_DOWN event | |
98 // types (although the latter is currently a no-op). | |
99 void RepostEvent(const ui::LocatedEvent& event); | |
100 | |
101 WindowTreeHostDelegate* AsWindowTreeHostDelegate(); | |
102 | |
103 // Invoked when the mouse events get enabled or disabled. | |
104 void OnMouseEventsEnableStateChanged(bool enabled); | |
105 | |
106 // Returns a target window for the given gesture event. | |
107 Window* GetGestureTarget(ui::GestureEvent* event); | |
108 | |
109 // Handles a gesture event. Returns true if handled. Unlike the other | |
110 // event-dispatching function (e.g. for touch/mouse/keyboard events), gesture | |
111 // events are dispatched from GestureRecognizer instead of WindowTreeHost. | |
112 void DispatchGestureEvent(ui::GestureEvent* event); | |
113 | |
114 // Invoked when |window| is being destroyed. | |
115 void OnWindowDestroying(Window* window); | |
116 | |
117 // Invoked when |window|'s bounds have changed. |contained_mouse| indicates if | |
118 // the bounds before change contained the |last_moust_location()|. | |
119 void OnWindowBoundsChanged(Window* window, bool contained_mouse); | |
120 | |
121 // Dispatches OnMouseExited to the |window| which is hiding if nessessary. | |
122 void DispatchMouseExitToHidingWindow(Window* window); | |
123 | |
124 // Dispatches a ui::ET_MOUSE_EXITED event at |point|. | |
125 void DispatchMouseExitAtPoint(const gfx::Point& point); | |
126 | |
127 // Invoked when |window|'s visibility has changed. | |
128 void OnWindowVisibilityChanged(Window* window, bool is_visible); | |
129 | |
130 // Invoked when |window|'s tranfrom has changed. |contained_mouse| | |
131 // indicates if the bounds before change contained the | |
132 // |last_moust_location()|. | |
133 void OnWindowTransformed(Window* window, bool contained_mouse); | |
134 | |
135 // Invoked when the keyboard mapping (in X11 terms: the mapping between | |
136 // keycodes and keysyms) has changed. | |
137 void OnKeyboardMappingChanged(); | |
138 | |
139 // The system windowing system has sent a request that we close our window. | |
140 void OnWindowTreeHostCloseRequested(); | |
141 | |
142 // Add/remove observer. There is no need to remove the observer if | |
143 // the root window is being deleted. In particular, you SHOULD NOT remove | |
144 // in |WindowObserver::OnWindowDestroying| of the observer observing | |
145 // the root window because it is too late to remove it. | |
146 void AddRootWindowObserver(RootWindowObserver* observer); | |
147 void RemoveRootWindowObserver(RootWindowObserver* observer); | |
148 | |
149 // Gesture Recognition ------------------------------------------------------- | |
150 | |
151 // When a touch event is dispatched to a Window, it may want to process the | |
152 // touch event asynchronously. In such cases, the window should consume the | |
153 // event during the event dispatch. Once the event is properly processed, the | |
154 // window should let the WindowEventDispatcher know about the result of the | |
155 // event processing, so that gesture events can be properly created and | |
156 // dispatched. | |
157 void ProcessedTouchEvent(ui::TouchEvent* event, | |
158 Window* window, | |
159 ui::EventResult result); | |
160 | |
161 // These methods are used to defer the processing of mouse/touch events | |
162 // related to resize. A client (typically a RenderWidgetHostViewAura) can call | |
163 // HoldPointerMoves when an resize is initiated and then ReleasePointerMoves | |
164 // once the resize is completed. | |
165 // | |
166 // More than one hold can be invoked and each hold must be cancelled by a | |
167 // release before we resume normal operation. | |
168 void HoldPointerMoves(); | |
169 void ReleasePointerMoves(); | |
170 | |
171 // Gets the last location seen in a mouse event in this root window's | |
172 // coordinates. This may return a point outside the root window's bounds. | |
173 gfx::Point GetLastMouseLocationInRoot() const; | |
174 | |
175 private: | |
176 FRIEND_TEST_ALL_PREFIXES(WindowEventDispatcherTest, | |
177 KeepTranslatedEventInRoot); | |
178 | |
179 friend class Window; | |
180 friend class TestScreen; | |
181 | |
182 // The parameter for OnWindowHidden() to specify why window is hidden. | |
183 enum WindowHiddenReason { | |
184 WINDOW_DESTROYED, // Window is destroyed. | |
185 WINDOW_HIDDEN, // Window is hidden. | |
186 WINDOW_MOVING, // Window is temporarily marked as hidden due to move | |
187 // across root windows. | |
188 }; | |
189 | |
190 // Updates the event with the appropriate transform for the device scale | |
191 // factor. The WindowTreeHostDelegate dispatches events in the physical pixel | |
192 // coordinate. But the event processing from WindowEventDispatcher onwards | |
193 // happen in device-independent pixel coordinate. So it is necessary to update | |
194 // the event received from the host. | |
195 void TransformEventForDeviceScaleFactor(ui::LocatedEvent* event); | |
196 | |
197 // Dispatches the specified event type (intended for enter/exit) to the | |
198 // |mouse_moved_handler_|. | |
199 ui::EventDispatchDetails DispatchMouseEnterOrExit( | |
200 const ui::MouseEvent& event, | |
201 ui::EventType type) WARN_UNUSED_RESULT; | |
202 ui::EventDispatchDetails ProcessGestures( | |
203 ui::GestureRecognizer::Gestures* gestures) WARN_UNUSED_RESULT; | |
204 | |
205 // Called when a Window is attached or detached from the | |
206 // WindowEventDispatcher. | |
207 void OnWindowAddedToRootWindow(Window* window); | |
208 void OnWindowRemovedFromRootWindow(Window* window, Window* new_root); | |
209 | |
210 // Called when a window becomes invisible, either by being removed | |
211 // from root window hierarchy, via SetVisible(false) or being destroyed. | |
212 // |reason| specifies what triggered the hiding. Note that becoming invisible | |
213 // will cause a window to lose capture and some windows may destroy themselves | |
214 // on capture (like DragDropTracker). | |
215 void OnWindowHidden(Window* invisible, WindowHiddenReason reason); | |
216 | |
217 // Cleans up the state of gestures for all windows in |window| (including | |
218 // |window| itself). This includes cancelling active touch points. | |
219 void CleanupGestureState(Window* window); | |
220 | |
221 // Overridden from aura::client::CaptureDelegate: | |
222 virtual void UpdateCapture(Window* old_capture, Window* new_capture) OVERRIDE; | |
223 virtual void OnOtherRootGotCapture() OVERRIDE; | |
224 virtual void SetNativeCapture() OVERRIDE; | |
225 virtual void ReleaseNativeCapture() OVERRIDE; | |
226 | |
227 // Overridden from ui::EventProcessor: | |
228 virtual ui::EventTarget* GetRootTarget() OVERRIDE; | |
229 virtual void PrepareEventForDispatch(ui::Event* event) OVERRIDE; | |
230 | |
231 // Overridden from ui::EventDispatcherDelegate. | |
232 virtual bool CanDispatchToTarget(ui::EventTarget* target) OVERRIDE; | |
233 virtual ui::EventDispatchDetails PreDispatchEvent(ui::EventTarget* target, | |
234 ui::Event* event) OVERRIDE; | |
235 virtual ui::EventDispatchDetails PostDispatchEvent( | |
236 ui::EventTarget* target, const ui::Event& event) OVERRIDE; | |
237 | |
238 // Overridden from ui::GestureEventHelper. | |
239 virtual bool CanDispatchToConsumer(ui::GestureConsumer* consumer) OVERRIDE; | |
240 virtual void DispatchPostponedGestureEvent(ui::GestureEvent* event) OVERRIDE; | |
241 virtual void DispatchCancelTouchEvent(ui::TouchEvent* event) OVERRIDE; | |
242 | |
243 // Overridden from ui::LayerAnimationObserver: | |
244 virtual void OnLayerAnimationEnded( | |
245 ui::LayerAnimationSequence* animation) OVERRIDE; | |
246 virtual void OnLayerAnimationScheduled( | |
247 ui::LayerAnimationSequence* animation) OVERRIDE; | |
248 virtual void OnLayerAnimationAborted( | |
249 ui::LayerAnimationSequence* animation) OVERRIDE; | |
250 | |
251 // Overridden from aura::WindowTreeHostDelegate: | |
252 virtual void OnHostCancelMode() OVERRIDE; | |
253 virtual void OnHostActivated() OVERRIDE; | |
254 virtual void OnHostLostWindowCapture() OVERRIDE; | |
255 virtual void OnHostLostMouseGrab() OVERRIDE; | |
256 virtual void OnHostMoved(const gfx::Point& origin) OVERRIDE; | |
257 virtual void OnHostResized(const gfx::Size& size) OVERRIDE; | |
258 virtual void OnCursorMovedToRootLocation( | |
259 const gfx::Point& root_location) OVERRIDE; | |
260 virtual WindowEventDispatcher* AsDispatcher() OVERRIDE; | |
261 virtual const WindowEventDispatcher* AsDispatcher() const OVERRIDE; | |
262 virtual ui::EventProcessor* GetEventProcessor() OVERRIDE; | |
263 | |
264 // We hold and aggregate mouse drags and touch moves as a way of throttling | |
265 // resizes when HoldMouseMoves() is called. The following methods are used to | |
266 // dispatch held and newly incoming mouse and touch events, typically when an | |
267 // event other than one of these needs dispatching or a matching | |
268 // ReleaseMouseMoves()/ReleaseTouchMoves() is called. NOTE: because these | |
269 // methods dispatch events from WindowTreeHost the coordinates are in terms of | |
270 // the root. | |
271 | |
272 ui::EventDispatchDetails DispatchHeldEvents() WARN_UNUSED_RESULT; | |
273 // Creates and dispatches synthesized mouse move event using the | |
274 // current mouse location. | |
275 ui::EventDispatchDetails SynthesizeMouseMoveEvent() WARN_UNUSED_RESULT; | |
276 | |
277 void SynthesizeMouseMoveEventAsync(); | |
278 | |
279 // Posts a task to send synthesized mouse move event if there | |
280 // is no a pending task. | |
281 void PostMouseMoveEventAfterWindowChange(); | |
282 | |
283 void PreDispatchLocatedEvent(Window* target, ui::LocatedEvent* event); | |
284 void PreDispatchMouseEvent(Window* target, ui::MouseEvent* event); | |
285 void PreDispatchTouchEvent(Window* target, ui::TouchEvent* event); | |
286 | |
287 // TODO(beng): evaluate the ideal ownership model. | |
288 scoped_ptr<Window> window_; | |
289 | |
290 scoped_ptr<WindowTreeHost> host_; | |
291 | |
292 // Touch ids that are currently down. | |
293 uint32 touch_ids_down_; | |
294 | |
295 ObserverList<RootWindowObserver> observers_; | |
296 | |
297 Window* mouse_pressed_handler_; | |
298 Window* mouse_moved_handler_; | |
299 Window* event_dispatch_target_; | |
300 Window* old_dispatch_target_; | |
301 | |
302 bool synthesize_mouse_move_; | |
303 | |
304 // How many move holds are outstanding. We try to defer dispatching | |
305 // touch/mouse moves while the count is > 0. | |
306 int move_hold_count_; | |
307 // The location of |held_move_event_| is in |window_|'s coordinate. | |
308 scoped_ptr<ui::LocatedEvent> held_move_event_; | |
309 | |
310 // Allowing for reposting of events. Used when exiting context menus. | |
311 scoped_ptr<ui::LocatedEvent> held_repostable_event_; | |
312 | |
313 // Set when dispatching a held event. | |
314 bool dispatching_held_event_; | |
315 | |
316 scoped_ptr<ui::ViewProp> prop_; | |
317 | |
318 // Used to schedule reposting an event. | |
319 base::WeakPtrFactory<WindowEventDispatcher> repost_event_factory_; | |
320 | |
321 // Used to schedule DispatchHeldEvents() when |move_hold_count_| goes to 0. | |
322 base::WeakPtrFactory<WindowEventDispatcher> held_event_factory_; | |
323 | |
324 DISALLOW_COPY_AND_ASSIGN(WindowEventDispatcher); | |
325 }; | |
326 | |
327 } // namespace aura | |
328 | |
329 #endif // UI_AURA_ROOT_WINDOW_H_ | |
OLD | NEW |