OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef UI_AURA_ROOT_WINDOW_H_ | 5 #ifndef UI_AURA_ROOT_WINDOW_H_ |
6 #define UI_AURA_ROOT_WINDOW_H_ | 6 #define UI_AURA_ROOT_WINDOW_H_ |
7 | 7 |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
11 #include "base/gtest_prod_util.h" | 11 #include "base/gtest_prod_util.h" |
12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
14 #include "base/memory/weak_ptr.h" | 14 #include "base/memory/weak_ptr.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
16 #include "ui/aura/aura_export.h" | 16 #include "ui/aura/aura_export.h" |
17 #include "ui/aura/client/capture_delegate.h" | 17 #include "ui/aura/client/capture_delegate.h" |
| 18 #include "ui/aura/window_tree_host.h" |
18 #include "ui/aura/window_tree_host_delegate.h" | 19 #include "ui/aura/window_tree_host_delegate.h" |
19 #include "ui/base/cursor/cursor.h" | 20 #include "ui/base/cursor/cursor.h" |
20 #include "ui/compositor/compositor.h" | 21 #include "ui/compositor/compositor.h" |
21 #include "ui/compositor/layer_animation_observer.h" | 22 #include "ui/compositor/layer_animation_observer.h" |
22 #include "ui/events/event_constants.h" | 23 #include "ui/events/event_constants.h" |
23 #include "ui/events/event_dispatcher.h" | 24 #include "ui/events/event_dispatcher.h" |
24 #include "ui/events/gestures/gesture_recognizer.h" | 25 #include "ui/events/gestures/gesture_recognizer.h" |
25 #include "ui/events/gestures/gesture_types.h" | 26 #include "ui/events/gestures/gesture_types.h" |
26 #include "ui/gfx/native_widget_types.h" | 27 #include "ui/gfx/native_widget_types.h" |
27 #include "ui/gfx/point.h" | 28 #include "ui/gfx/point.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 virtual ~RootWindow(); | 74 virtual ~RootWindow(); |
74 | 75 |
75 // Returns the RootWindowHost for the specified accelerated widget, or NULL | 76 // Returns the RootWindowHost for the specified accelerated widget, or NULL |
76 // if there is none associated. | 77 // if there is none associated. |
77 static RootWindow* GetForAcceleratedWidget(gfx::AcceleratedWidget widget); | 78 static RootWindow* GetForAcceleratedWidget(gfx::AcceleratedWidget widget); |
78 | 79 |
79 Window* window() { | 80 Window* window() { |
80 return const_cast<Window*>(const_cast<const RootWindow*>(this)->window()); | 81 return const_cast<Window*>(const_cast<const RootWindow*>(this)->window()); |
81 } | 82 } |
82 const Window* window() const { return window_.get(); } | 83 const Window* window() const { return window_.get(); } |
| 84 RootWindowHost* host() { |
| 85 return const_cast<RootWindowHost*>( |
| 86 const_cast<const RootWindow*>(this)->host()); |
| 87 } |
| 88 const RootWindowHost* host() const { return host_.get(); } |
83 ui::Compositor* compositor() { return compositor_.get(); } | 89 ui::Compositor* compositor() { return compositor_.get(); } |
84 gfx::NativeCursor last_cursor() const { return last_cursor_; } | 90 gfx::NativeCursor last_cursor() const { return last_cursor_; } |
85 Window* mouse_pressed_handler() { return mouse_pressed_handler_; } | 91 Window* mouse_pressed_handler() { return mouse_pressed_handler_; } |
86 Window* mouse_moved_handler() { return mouse_moved_handler_; } | 92 Window* mouse_moved_handler() { return mouse_moved_handler_; } |
87 | 93 |
88 // Initializes the root window. | 94 // Initializes the root window. |
89 void Init(); | 95 void Init(); |
90 | 96 |
91 // Shows the root window host. | |
92 void ShowRootWindow(); | |
93 | |
94 // Hides the root window host. | |
95 void HideRootWindow(); | |
96 | |
97 // Stop listening events in preparation for shutdown. | 97 // Stop listening events in preparation for shutdown. |
98 void PrepareForShutdown(); | 98 void PrepareForShutdown(); |
99 | 99 |
100 // Repost event for re-processing. Used when exiting context menus. | 100 // Repost event for re-processing. Used when exiting context menus. |
101 // We only support the ET_MOUSE_PRESSED and ET_GESTURE_TAP_DOWN event | 101 // We only support the ET_MOUSE_PRESSED and ET_GESTURE_TAP_DOWN event |
102 // types (although the latter is currently a no-op). | 102 // types (although the latter is currently a no-op). |
103 void RepostEvent(const ui::LocatedEvent& event); | 103 void RepostEvent(const ui::LocatedEvent& event); |
104 | 104 |
105 RootWindowHostDelegate* AsRootWindowHostDelegate(); | 105 RootWindowHostDelegate* AsRootWindowHostDelegate(); |
106 | 106 |
107 // Gets/sets the size of the host window. | 107 // Gets/sets the size of the host window. |
108 void SetHostSize(const gfx::Size& size_in_pixel); | 108 void SetHostSize(const gfx::Size& size_in_pixel); |
109 gfx::Size GetHostSize() const; | |
110 | 109 |
111 // Sets the bounds of the host window. | 110 // Sets the bounds of the host window. |
112 void SetHostBounds(const gfx::Rect& size_in_pizel); | 111 void SetHostBounds(const gfx::Rect& size_in_pizel); |
113 | 112 |
114 // Returns where the RootWindow is on screen. | |
115 gfx::Point GetHostOrigin() const; | |
116 | |
117 // Sets the currently-displayed cursor. If the cursor was previously hidden | 113 // Sets the currently-displayed cursor. If the cursor was previously hidden |
118 // via ShowCursor(false), it will remain hidden until ShowCursor(true) is | 114 // via ShowCursor(false), it will remain hidden until ShowCursor(true) is |
119 // called, at which point the cursor that was last set via SetCursor() will be | 115 // called, at which point the cursor that was last set via SetCursor() will be |
120 // used. | 116 // used. |
121 void SetCursor(gfx::NativeCursor cursor); | 117 void SetCursor(gfx::NativeCursor cursor); |
122 | 118 |
123 // Invoked when the cursor's visibility has changed. | 119 // Invoked when the cursor's visibility has changed. |
124 void OnCursorVisibilityChanged(bool visible); | 120 void OnCursorVisibilityChanged(bool visible); |
125 | 121 |
126 // Invoked when the mouse events get enabled or disabled. | 122 // Invoked when the mouse events get enabled or disabled. |
127 void OnMouseEventsEnableStateChanged(bool enabled); | 123 void OnMouseEventsEnableStateChanged(bool enabled); |
128 | 124 |
129 // Moves the cursor to the specified location relative to the root window. | 125 // Moves the cursor to the specified location relative to the root window. |
130 void MoveCursorTo(const gfx::Point& location); | 126 void MoveCursorTo(const gfx::Point& location); |
131 | 127 |
132 // Moves the cursor to the |host_location| given in host coordinates. | 128 // Moves the cursor to the |host_location| given in host coordinates. |
133 void MoveCursorToHostLocation(const gfx::Point& host_location); | 129 void MoveCursorToHostLocation(const gfx::Point& host_location); |
134 | 130 |
135 // Clips the cursor movement to the root_window. | |
136 bool ConfineCursorToWindow(); | |
137 | |
138 // Restores the cursor movement beyond the root window. | |
139 void UnConfineCursor(); | |
140 | |
141 // Draw the damage_rect. | 131 // Draw the damage_rect. |
142 void ScheduleRedrawRect(const gfx::Rect& damage_rect); | 132 void ScheduleRedrawRect(const gfx::Rect& damage_rect); |
143 | 133 |
144 // Returns a target window for the given gesture event. | 134 // Returns a target window for the given gesture event. |
145 Window* GetGestureTarget(ui::GestureEvent* event); | 135 Window* GetGestureTarget(ui::GestureEvent* event); |
146 | 136 |
147 // Handles a gesture event. Returns true if handled. Unlike the other | 137 // Handles a gesture event. Returns true if handled. Unlike the other |
148 // event-dispatching function (e.g. for touch/mouse/keyboard events), gesture | 138 // event-dispatching function (e.g. for touch/mouse/keyboard events), gesture |
149 // events are dispatched from GestureRecognizer instead of RootWindowHost. | 139 // events are dispatched from GestureRecognizer instead of RootWindowHost. |
150 void DispatchGestureEvent(ui::GestureEvent* event); | 140 void DispatchGestureEvent(ui::GestureEvent* event); |
(...skipping 26 matching lines...) Expand all Loading... |
177 // The system windowing system has sent a request that we close our window. | 167 // The system windowing system has sent a request that we close our window. |
178 void OnRootWindowHostCloseRequested(); | 168 void OnRootWindowHostCloseRequested(); |
179 | 169 |
180 // Add/remove observer. There is no need to remove the observer if | 170 // Add/remove observer. There is no need to remove the observer if |
181 // the root window is being deleted. In particular, you SHOULD NOT remove | 171 // the root window is being deleted. In particular, you SHOULD NOT remove |
182 // in |WindowObserver::OnWindowDestroying| of the observer observing | 172 // in |WindowObserver::OnWindowDestroying| of the observer observing |
183 // the root window because it is too late to remove it. | 173 // the root window because it is too late to remove it. |
184 void AddRootWindowObserver(RootWindowObserver* observer); | 174 void AddRootWindowObserver(RootWindowObserver* observer); |
185 void RemoveRootWindowObserver(RootWindowObserver* observer); | 175 void RemoveRootWindowObserver(RootWindowObserver* observer); |
186 | 176 |
187 // Posts |native_event| to the platform's event queue. | |
188 void PostNativeEvent(const base::NativeEvent& native_event); | |
189 | |
190 // Converts |point| from the root window's coordinate system to native | |
191 // screen's. | |
192 void ConvertPointToNativeScreen(gfx::Point* point) const; | |
193 | |
194 // Converts |point| from native screen coordinate system to the root window's. | |
195 void ConvertPointFromNativeScreen(gfx::Point* point) const; | |
196 | |
197 // Converts |point| from the root window's coordinate system to the | 177 // Converts |point| from the root window's coordinate system to the |
198 // host window's. | 178 // host window's. |
199 void ConvertPointToHost(gfx::Point* point) const; | 179 void ConvertPointToHost(gfx::Point* point) const; |
200 | 180 |
201 // Converts |point| from the host window's coordinate system to the | 181 // Converts |point| from the host window's coordinate system to the |
202 // root window's. | 182 // root window's. |
203 void ConvertPointFromHost(gfx::Point* point) const; | 183 void ConvertPointFromHost(gfx::Point* point) const; |
204 | 184 |
205 // Gesture Recognition ------------------------------------------------------- | 185 // Gesture Recognition ------------------------------------------------------- |
206 | 186 |
207 // When a touch event is dispatched to a Window, it may want to process the | 187 // When a touch event is dispatched to a Window, it may want to process the |
208 // touch event asynchronously. In such cases, the window should consume the | 188 // touch event asynchronously. In such cases, the window should consume the |
209 // event during the event dispatch. Once the event is properly processed, the | 189 // event during the event dispatch. Once the event is properly processed, the |
210 // window should let the RootWindow know about the result of the event | 190 // window should let the RootWindow know about the result of the event |
211 // processing, so that gesture events can be properly created and dispatched. | 191 // processing, so that gesture events can be properly created and dispatched. |
212 void ProcessedTouchEvent(ui::TouchEvent* event, | 192 void ProcessedTouchEvent(ui::TouchEvent* event, |
213 Window* window, | 193 Window* window, |
214 ui::EventResult result); | 194 ui::EventResult result); |
215 | 195 |
216 // Returns the accelerated widget from the RootWindowHost. | |
217 gfx::AcceleratedWidget GetAcceleratedWidget(); | |
218 | |
219 // Toggles the host's full screen state. | |
220 void ToggleFullScreen(); | |
221 | |
222 // These methods are used to defer the processing of mouse/touch events | 196 // These methods are used to defer the processing of mouse/touch events |
223 // related to resize. A client (typically a RenderWidgetHostViewAura) can call | 197 // related to resize. A client (typically a RenderWidgetHostViewAura) can call |
224 // HoldPointerMoves when an resize is initiated and then ReleasePointerMoves | 198 // HoldPointerMoves when an resize is initiated and then ReleasePointerMoves |
225 // once the resize is completed. | 199 // once the resize is completed. |
226 // | 200 // |
227 // More than one hold can be invoked and each hold must be cancelled by a | 201 // More than one hold can be invoked and each hold must be cancelled by a |
228 // release before we resume normal operation. | 202 // release before we resume normal operation. |
229 void HoldPointerMoves(); | 203 void HoldPointerMoves(); |
230 void ReleasePointerMoves(); | 204 void ReleasePointerMoves(); |
231 | 205 |
232 // Sets if the window should be focused when shown. | |
233 void SetFocusWhenShown(bool focus_when_shown); | |
234 | |
235 // Gets the last location seen in a mouse event in this root window's | 206 // Gets the last location seen in a mouse event in this root window's |
236 // coordinates. This may return a point outside the root window's bounds. | 207 // coordinates. This may return a point outside the root window's bounds. |
237 gfx::Point GetLastMouseLocationInRoot() const; | 208 gfx::Point GetLastMouseLocationInRoot() const; |
238 | 209 |
239 // Exposes RootWindowHost::QueryMouseLocation() for test purposes. | |
240 bool QueryMouseLocationForTest(gfx::Point* point) const; | |
241 | |
242 void SetRootWindowTransformer(scoped_ptr<RootWindowTransformer> transformer); | 210 void SetRootWindowTransformer(scoped_ptr<RootWindowTransformer> transformer); |
243 gfx::Transform GetRootTransform() const; | 211 gfx::Transform GetRootTransform() const; |
244 | 212 |
245 void SetTransform(const gfx::Transform& transform); | 213 void SetTransform(const gfx::Transform& transform); |
246 | 214 |
247 void DeviceScaleFactorChanged(float device_scale_factor); | |
248 | |
249 private: | 215 private: |
250 FRIEND_TEST_ALL_PREFIXES(RootWindowTest, KeepTranslatedEventInRoot); | 216 FRIEND_TEST_ALL_PREFIXES(RootWindowTest, KeepTranslatedEventInRoot); |
251 | 217 |
252 friend class Window; | 218 friend class Window; |
253 friend class TestScreen; | 219 friend class TestScreen; |
254 | 220 |
255 // The parameter for OnWindowHidden() to specify why window is hidden. | 221 // The parameter for OnWindowHidden() to specify why window is hidden. |
256 enum WindowHiddenReason { | 222 enum WindowHiddenReason { |
257 WINDOW_DESTROYED, // Window is destroyed. | 223 WINDOW_DESTROYED, // Window is destroyed. |
258 WINDOW_HIDDEN, // Window is hidden. | 224 WINDOW_HIDDEN, // Window is hidden. |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 virtual bool OnHostTouchEvent(ui::TouchEvent* event) OVERRIDE; | 294 virtual bool OnHostTouchEvent(ui::TouchEvent* event) OVERRIDE; |
329 virtual void OnHostCancelMode() OVERRIDE; | 295 virtual void OnHostCancelMode() OVERRIDE; |
330 virtual void OnHostActivated() OVERRIDE; | 296 virtual void OnHostActivated() OVERRIDE; |
331 virtual void OnHostLostWindowCapture() OVERRIDE; | 297 virtual void OnHostLostWindowCapture() OVERRIDE; |
332 virtual void OnHostLostMouseGrab() OVERRIDE; | 298 virtual void OnHostLostMouseGrab() OVERRIDE; |
333 virtual void OnHostPaint(const gfx::Rect& damage_rect) OVERRIDE; | 299 virtual void OnHostPaint(const gfx::Rect& damage_rect) OVERRIDE; |
334 virtual void OnHostMoved(const gfx::Point& origin) OVERRIDE; | 300 virtual void OnHostMoved(const gfx::Point& origin) OVERRIDE; |
335 virtual void OnHostResized(const gfx::Size& size) OVERRIDE; | 301 virtual void OnHostResized(const gfx::Size& size) OVERRIDE; |
336 virtual float GetDeviceScaleFactor() OVERRIDE; | 302 virtual float GetDeviceScaleFactor() OVERRIDE; |
337 virtual RootWindow* AsRootWindow() OVERRIDE; | 303 virtual RootWindow* AsRootWindow() OVERRIDE; |
| 304 virtual const RootWindow* AsRootWindow() const OVERRIDE; |
338 | 305 |
339 ui::EventDispatchDetails OnHostMouseEventImpl(ui::MouseEvent* event) | 306 ui::EventDispatchDetails OnHostMouseEventImpl(ui::MouseEvent* event) |
340 WARN_UNUSED_RESULT; | 307 WARN_UNUSED_RESULT; |
341 | 308 |
342 // We hold and aggregate mouse drags and touch moves as a way of throttling | 309 // We hold and aggregate mouse drags and touch moves as a way of throttling |
343 // resizes when HoldMouseMoves() is called. The following methods are used to | 310 // resizes when HoldMouseMoves() is called. The following methods are used to |
344 // dispatch held and newly incoming mouse and touch events, typically when an | 311 // dispatch held and newly incoming mouse and touch events, typically when an |
345 // event other than one of these needs dispatching or a matching | 312 // event other than one of these needs dispatching or a matching |
346 // ReleaseMouseMoves()/ReleaseTouchMoves() is called. NOTE: because these | 313 // ReleaseMouseMoves()/ReleaseTouchMoves() is called. NOTE: because these |
347 // methods dispatch events from RootWindowHost the coordinates are in terms of | 314 // methods dispatch events from RootWindowHost the coordinates are in terms of |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 | 378 |
412 // Used to schedule DispatchHeldEvents() when |move_hold_count_| goes to 0. | 379 // Used to schedule DispatchHeldEvents() when |move_hold_count_| goes to 0. |
413 base::WeakPtrFactory<RootWindow> held_event_factory_; | 380 base::WeakPtrFactory<RootWindow> held_event_factory_; |
414 | 381 |
415 DISALLOW_COPY_AND_ASSIGN(RootWindow); | 382 DISALLOW_COPY_AND_ASSIGN(RootWindow); |
416 }; | 383 }; |
417 | 384 |
418 } // namespace aura | 385 } // namespace aura |
419 | 386 |
420 #endif // UI_AURA_ROOT_WINDOW_H_ | 387 #endif // UI_AURA_ROOT_WINDOW_H_ |
OLD | NEW |