OLD | NEW |
| (Empty) |
1 // Copyright 2015 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 COMPONENTS_MUS_WS_DISPLAY_H_ | |
6 #define COMPONENTS_MUS_WS_DISPLAY_H_ | |
7 | |
8 #include <stdint.h> | |
9 | |
10 #include <map> | |
11 #include <memory> | |
12 #include <queue> | |
13 #include <set> | |
14 | |
15 #include "base/macros.h" | |
16 #include "base/memory/weak_ptr.h" | |
17 #include "components/mus/common/types.h" | |
18 #include "components/mus/public/interfaces/window_manager_constants.mojom.h" | |
19 #include "components/mus/public/interfaces/window_tree_host.mojom.h" | |
20 #include "components/mus/ws/focus_controller_delegate.h" | |
21 #include "components/mus/ws/focus_controller_observer.h" | |
22 #include "components/mus/ws/platform_display.h" | |
23 #include "components/mus/ws/server_window.h" | |
24 #include "components/mus/ws/server_window_observer.h" | |
25 #include "components/mus/ws/server_window_tracker.h" | |
26 #include "components/mus/ws/user_id_tracker_observer.h" | |
27 #include "components/mus/ws/window_manager_window_tree_factory_set_observer.h" | |
28 | |
29 namespace mus { | |
30 namespace ws { | |
31 | |
32 class DisplayBinding; | |
33 class DisplayManager; | |
34 class FocusController; | |
35 struct PlatformDisplayInitParams; | |
36 class WindowManagerDisplayRoot; | |
37 class WindowServer; | |
38 class WindowTree; | |
39 | |
40 namespace test { | |
41 class DisplayTestApi; | |
42 } | |
43 | |
44 // Displays manages the state associated with a single display. Display has a | |
45 // single root window whose children are the roots for a per-user | |
46 // WindowManager. Display is configured in two distinct | |
47 // ways: | |
48 // . with a DisplayBinding. In this mode there is only ever one WindowManager | |
49 // for the display, which comes from the client that created the | |
50 // Display. | |
51 // . without a DisplayBinding. In this mode a WindowManager is automatically | |
52 // created per user. | |
53 class Display : public PlatformDisplayDelegate, | |
54 public mojom::WindowTreeHost, | |
55 public FocusControllerObserver, | |
56 public FocusControllerDelegate, | |
57 public ServerWindowObserver, | |
58 public UserIdTrackerObserver, | |
59 public WindowManagerWindowTreeFactorySetObserver { | |
60 public: | |
61 Display(WindowServer* window_server, | |
62 const PlatformDisplayInitParams& platform_display_init_params); | |
63 ~Display() override; | |
64 | |
65 // Initializes state that depends on the existence of a Display. | |
66 void Init(std::unique_ptr<DisplayBinding> binding); | |
67 | |
68 uint32_t id() const { return id_; } | |
69 | |
70 DisplayManager* display_manager(); | |
71 const DisplayManager* display_manager() const; | |
72 | |
73 PlatformDisplay* platform_display() { return platform_display_.get(); } | |
74 | |
75 // Returns a mojom::Display for the specified display. WindowManager specific | |
76 // values are not set. | |
77 mojom::DisplayPtr ToMojomDisplay() const; | |
78 | |
79 // Schedules a paint for the specified region in the coordinates of |window|. | |
80 void SchedulePaint(const ServerWindow* window, const gfx::Rect& bounds); | |
81 | |
82 // Schedules destruction of surfaces in |window|. If a frame has been | |
83 // scheduled but not drawn surface destruction is delayed until the frame is | |
84 // drawn, otherwise destruction is immediate. | |
85 void ScheduleSurfaceDestruction(ServerWindow* window); | |
86 | |
87 mojom::Rotation GetRotation() const; | |
88 gfx::Size GetSize() const; | |
89 | |
90 // Returns the id for the corresponding id. | |
91 int64_t GetPlatformDisplayId() const; | |
92 | |
93 WindowServer* window_server() { return window_server_; } | |
94 | |
95 // Returns the root of the Display. The root's children are the roots | |
96 // of the corresponding WindowManagers. | |
97 ServerWindow* root_window() { return root_.get(); } | |
98 const ServerWindow* root_window() const { return root_.get(); } | |
99 | |
100 // Returns the ServerWindow whose id is |id|. This does not do a search over | |
101 // all windows, rather just the display and window manager root windows. | |
102 // | |
103 // In general you shouldn't use this, rather use WindowServer::GetWindow(), | |
104 // which calls this as necessary. | |
105 ServerWindow* GetRootWithId(const WindowId& id); | |
106 | |
107 WindowManagerDisplayRoot* GetWindowManagerDisplayRootWithRoot( | |
108 const ServerWindow* window); | |
109 WindowManagerDisplayRoot* GetWindowManagerDisplayRootForUser( | |
110 const UserId& user_id) { | |
111 return const_cast<WindowManagerDisplayRoot*>( | |
112 const_cast<const Display*>(this)->GetWindowManagerDisplayRootForUser( | |
113 user_id)); | |
114 } | |
115 const WindowManagerDisplayRoot* GetWindowManagerDisplayRootForUser( | |
116 const UserId& user_id) const; | |
117 WindowManagerDisplayRoot* GetActiveWindowManagerDisplayRoot() { | |
118 return const_cast<WindowManagerDisplayRoot*>( | |
119 const_cast<const Display*>(this)->GetActiveWindowManagerDisplayRoot()); | |
120 } | |
121 const WindowManagerDisplayRoot* GetActiveWindowManagerDisplayRoot() const; | |
122 size_t num_window_manger_states() const { | |
123 return window_manager_display_root_map_.size(); | |
124 } | |
125 | |
126 // TODO(sky): this should only be called by WindowServer, move to interface | |
127 // used by WindowServer. | |
128 // See description of WindowServer::SetFocusedWindow() for details on return | |
129 // value. | |
130 bool SetFocusedWindow(ServerWindow* window); | |
131 // NOTE: this returns the focused window only if the focused window is in this | |
132 // display. If this returns null focus may be in another display. | |
133 ServerWindow* GetFocusedWindow(); | |
134 | |
135 void ActivateNextWindow(); | |
136 | |
137 void AddActivationParent(ServerWindow* window); | |
138 void RemoveActivationParent(ServerWindow* window); | |
139 | |
140 void UpdateTextInputState(ServerWindow* window, | |
141 const ui::TextInputState& state); | |
142 void SetImeVisibility(ServerWindow* window, bool visible); | |
143 | |
144 // Called just before |tree| is destroyed. | |
145 void OnWillDestroyTree(WindowTree* tree); | |
146 | |
147 void UpdateNativeCursor(int32_t cursor_id); | |
148 | |
149 // mojom::WindowTreeHost: | |
150 void SetSize(const gfx::Size& size) override; | |
151 void SetTitle(const mojo::String& title) override; | |
152 | |
153 private: | |
154 friend class test::DisplayTestApi; | |
155 | |
156 using WindowManagerDisplayRootMap = | |
157 std::map<UserId, std::unique_ptr<WindowManagerDisplayRoot>>; | |
158 | |
159 // Inits the necessary state once the display is ready. | |
160 void InitWindowManagerDisplayRootsIfNecessary(); | |
161 | |
162 // Creates the set of WindowManagerDisplayRoots from the | |
163 // WindowManagerWindowTreeFactorySet. | |
164 void CreateWindowManagerDisplayRootsFromFactories(); | |
165 | |
166 void CreateWindowManagerDisplayRootFromFactory( | |
167 WindowManagerWindowTreeFactory* factory); | |
168 | |
169 // PlatformDisplayDelegate: | |
170 ServerWindow* GetRootWindow() override; | |
171 void OnEvent(const ui::Event& event) override; | |
172 void OnNativeCaptureLost() override; | |
173 void OnDisplayClosed() override; | |
174 void OnViewportMetricsChanged(const ViewportMetrics& old_metrics, | |
175 const ViewportMetrics& new_metrics) override; | |
176 void OnCompositorFrameDrawn() override; | |
177 | |
178 // FocusControllerDelegate: | |
179 bool CanHaveActiveChildren(ServerWindow* window) const override; | |
180 | |
181 // FocusControllerObserver: | |
182 void OnActivationChanged(ServerWindow* old_active_window, | |
183 ServerWindow* new_active_window) override; | |
184 void OnFocusChanged(FocusControllerChangeSource change_source, | |
185 ServerWindow* old_focused_window, | |
186 ServerWindow* new_focused_window) override; | |
187 | |
188 // ServerWindowObserver: | |
189 void OnWindowDestroyed(ServerWindow* window) override; | |
190 | |
191 // UserIdTrackerObserver: | |
192 void OnUserIdRemoved(const UserId& id) override; | |
193 | |
194 // WindowManagerWindowTreeFactorySetObserver: | |
195 void OnWindowManagerWindowTreeFactoryReady( | |
196 WindowManagerWindowTreeFactory* factory) override; | |
197 | |
198 const uint32_t id_; | |
199 std::unique_ptr<DisplayBinding> binding_; | |
200 // Set once Init() has been called. | |
201 bool init_called_ = false; | |
202 WindowServer* const window_server_; | |
203 std::unique_ptr<ServerWindow> root_; | |
204 std::unique_ptr<PlatformDisplay> platform_display_; | |
205 std::unique_ptr<FocusController> focus_controller_; | |
206 | |
207 // The last cursor set. Used to track whether we need to change the cursor. | |
208 int32_t last_cursor_; | |
209 | |
210 ServerWindowTracker activation_parents_; | |
211 | |
212 // Set of windows with surfaces that need to be destroyed once the frame | |
213 // draws. | |
214 std::set<ServerWindow*> windows_needing_frame_destruction_; | |
215 | |
216 WindowManagerDisplayRootMap window_manager_display_root_map_; | |
217 | |
218 DISALLOW_COPY_AND_ASSIGN(Display); | |
219 }; | |
220 | |
221 } // namespace ws | |
222 } // namespace mus | |
223 | |
224 #endif // COMPONENTS_MUS_WS_DISPLAY_H_ | |
OLD | NEW |