Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Side by Side Diff: components/mus/ws/display.cc

Issue 2089023002: Promotes remaining global window manager state into WindowManagerState (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: override Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/mus/ws/display.h ('k') | components/mus/ws/display_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 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 #include "components/mus/ws/display.h" 5 #include "components/mus/ws/display.h"
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/debug/debugger.h" 10 #include "base/debug/debugger.h"
11 #include "base/strings/utf_string_conversions.h" 11 #include "base/strings/utf_string_conversions.h"
12 #include "components/mus/common/types.h" 12 #include "components/mus/common/types.h"
13 #include "components/mus/ws/display_binding.h" 13 #include "components/mus/ws/display_binding.h"
14 #include "components/mus/ws/display_manager.h" 14 #include "components/mus/ws/display_manager.h"
15 #include "components/mus/ws/focus_controller.h" 15 #include "components/mus/ws/focus_controller.h"
16 #include "components/mus/ws/platform_display.h" 16 #include "components/mus/ws/platform_display.h"
17 #include "components/mus/ws/platform_display_init_params.h" 17 #include "components/mus/ws/platform_display_init_params.h"
18 #include "components/mus/ws/window_manager_display_root.h"
18 #include "components/mus/ws/window_manager_state.h" 19 #include "components/mus/ws/window_manager_state.h"
19 #include "components/mus/ws/window_manager_window_tree_factory.h" 20 #include "components/mus/ws/window_manager_window_tree_factory.h"
20 #include "components/mus/ws/window_server.h" 21 #include "components/mus/ws/window_server.h"
21 #include "components/mus/ws/window_server_delegate.h" 22 #include "components/mus/ws/window_server_delegate.h"
22 #include "components/mus/ws/window_tree.h" 23 #include "components/mus/ws/window_tree.h"
23 #include "components/mus/ws/window_tree_binding.h" 24 #include "components/mus/ws/window_tree_binding.h"
24 #include "mojo/common/common_type_converters.h" 25 #include "mojo/common/common_type_converters.h"
25 #include "services/shell/public/interfaces/connector.mojom.h" 26 #include "services/shell/public/interfaces/connector.mojom.h"
26 #include "ui/base/cursor/cursor.h" 27 #include "ui/base/cursor/cursor.h"
27 28
(...skipping 19 matching lines...) Expand all
47 this); 48 this);
48 49
49 if (!focus_controller_) { 50 if (!focus_controller_) {
50 focus_controller_->RemoveObserver(this); 51 focus_controller_->RemoveObserver(this);
51 focus_controller_.reset(); 52 focus_controller_.reset();
52 } 53 }
53 54
54 for (ServerWindow* window : windows_needing_frame_destruction_) 55 for (ServerWindow* window : windows_needing_frame_destruction_)
55 window->RemoveObserver(this); 56 window->RemoveObserver(this);
56 57
57 // Destroy any trees, which triggers destroying the WindowManagerState. Copy 58 // If there is a |binding_| then the tree was created specifically for this
58 // off the WindowManagerStates as destruction mutates 59 // display (which corresponds to a WindowTreeHost).
59 // |window_manager_state_map_|. 60 if (binding_ && !window_manager_display_root_map_.empty()) {
60 std::set<WindowManagerState*> states; 61 window_server_->DestroyTree(window_manager_display_root_map_.begin()
61 for (auto& pair : window_manager_state_map_) 62 ->second->window_manager_state()
62 states.insert(pair.second.get()); 63 ->window_tree());
63 for (WindowManagerState* state : states) 64 }
64 window_server_->DestroyTree(state->tree());
65 } 65 }
66 66
67 void Display::Init(std::unique_ptr<DisplayBinding> binding) { 67 void Display::Init(std::unique_ptr<DisplayBinding> binding) {
68 init_called_ = true; 68 init_called_ = true;
69 binding_ = std::move(binding); 69 binding_ = std::move(binding);
70 display_manager()->AddDisplay(this); 70 display_manager()->AddDisplay(this);
71 InitWindowManagersIfNecessary(); 71 InitWindowManagerDisplayRootsIfNecessary();
72 } 72 }
73 73
74 DisplayManager* Display::display_manager() { 74 DisplayManager* Display::display_manager() {
75 return window_server_->display_manager(); 75 return window_server_->display_manager();
76 } 76 }
77 77
78 const DisplayManager* Display::display_manager() const { 78 const DisplayManager* Display::display_manager() const {
79 return window_server_->display_manager(); 79 return window_server_->display_manager();
80 } 80 }
81 81
(...skipping 26 matching lines...) Expand all
108 if (!platform_display_->IsFramePending()) { 108 if (!platform_display_->IsFramePending()) {
109 window->DestroySurfacesScheduledForDestruction(); 109 window->DestroySurfacesScheduledForDestruction();
110 return; 110 return;
111 } 111 }
112 if (windows_needing_frame_destruction_.count(window)) 112 if (windows_needing_frame_destruction_.count(window))
113 return; 113 return;
114 windows_needing_frame_destruction_.insert(window); 114 windows_needing_frame_destruction_.insert(window);
115 window->AddObserver(this); 115 window->AddObserver(this);
116 } 116 }
117 117
118 ServerWindow* Display::GetRootWithId(const WindowId& id) {
119 if (id == root_->id())
120 return root_.get();
121 for (auto& pair : window_manager_state_map_) {
122 if (pair.second->root()->id() == id)
123 return pair.second->root();
124 }
125 return nullptr;
126 }
127
128 WindowManagerState* Display::GetWindowManagerStateWithRoot(
129 const ServerWindow* window) {
130 for (auto& pair : window_manager_state_map_) {
131 if (pair.second->root() == window)
132 return pair.second.get();
133 }
134 return nullptr;
135 }
136
137 const WindowManagerState* Display::GetWindowManagerStateForUser(
138 const UserId& user_id) const {
139 auto iter = window_manager_state_map_.find(user_id);
140 return iter == window_manager_state_map_.end() ? nullptr : iter->second.get();
141 }
142
143 mojom::Rotation Display::GetRotation() const { 118 mojom::Rotation Display::GetRotation() const {
144 return platform_display_->GetRotation(); 119 return platform_display_->GetRotation();
145 } 120 }
146 121
147 gfx::Size Display::GetSize() const { 122 gfx::Size Display::GetSize() const {
148 return root_->bounds().size(); 123 return root_->bounds().size();
149 } 124 }
150 125
151 int64_t Display::GetPlatformDisplayId() const { 126 int64_t Display::GetPlatformDisplayId() const {
152 return platform_display_->GetDisplayId(); 127 return platform_display_->GetDisplayId();
153 } 128 }
154 129
155 const WindowManagerState* Display::GetActiveWindowManagerState() const { 130 ServerWindow* Display::GetRootWithId(const WindowId& id) {
156 return GetWindowManagerStateForUser( 131 if (id == root_->id())
132 return root_.get();
133 for (auto& pair : window_manager_display_root_map_) {
134 if (pair.second->root()->id() == id)
135 return pair.second->root();
136 }
137 return nullptr;
138 }
139
140 WindowManagerDisplayRoot* Display::GetWindowManagerDisplayRootWithRoot(
141 const ServerWindow* window) {
142 for (auto& pair : window_manager_display_root_map_) {
143 if (pair.second->root() == window)
144 return pair.second.get();
145 }
146 return nullptr;
147 }
148
149 const WindowManagerDisplayRoot* Display::GetWindowManagerDisplayRootForUser(
150 const UserId& user_id) const {
151 auto iter = window_manager_display_root_map_.find(user_id);
152 return iter == window_manager_display_root_map_.end() ? nullptr
153 : iter->second.get();
154 }
155
156 const WindowManagerDisplayRoot* Display::GetActiveWindowManagerDisplayRoot()
157 const {
158 return GetWindowManagerDisplayRootForUser(
157 window_server_->user_id_tracker()->active_id()); 159 window_server_->user_id_tracker()->active_id());
158 } 160 }
159 161
160 bool Display::SetFocusedWindow(ServerWindow* new_focused_window) { 162 bool Display::SetFocusedWindow(ServerWindow* new_focused_window) {
161 ServerWindow* old_focused_window = focus_controller_->GetFocusedWindow(); 163 ServerWindow* old_focused_window = focus_controller_->GetFocusedWindow();
162 if (old_focused_window == new_focused_window) 164 if (old_focused_window == new_focused_window)
163 return true; 165 return true;
164 DCHECK(!new_focused_window || root_window()->Contains(new_focused_window)); 166 DCHECK(!new_focused_window || root_window()->Contains(new_focused_window));
165 return focus_controller_->SetFocusedWindow(new_focused_window); 167 return focus_controller_->SetFocusedWindow(new_focused_window);
166 } 168 }
(...skipping 25 matching lines...) Expand all
192 } 194 }
193 195
194 void Display::SetImeVisibility(ServerWindow* window, bool visible) { 196 void Display::SetImeVisibility(ServerWindow* window, bool visible) {
195 // Do not need to show or hide IME for unfocused window. 197 // Do not need to show or hide IME for unfocused window.
196 if (focus_controller_->GetFocusedWindow() != window) 198 if (focus_controller_->GetFocusedWindow() != window)
197 return; 199 return;
198 platform_display_->SetImeVisibility(visible); 200 platform_display_->SetImeVisibility(visible);
199 } 201 }
200 202
201 void Display::OnWillDestroyTree(WindowTree* tree) { 203 void Display::OnWillDestroyTree(WindowTree* tree) {
202 for (auto it = window_manager_state_map_.begin(); 204 for (auto it = window_manager_display_root_map_.begin();
203 it != window_manager_state_map_.end(); ++it) { 205 it != window_manager_display_root_map_.end(); ++it) {
204 if (it->second->tree() == tree) { 206 if (it->second->window_manager_state()->window_tree() == tree) {
205 window_manager_state_map_.erase(it); 207 window_manager_display_root_map_.erase(it);
206 break; 208 break;
207 } 209 }
208 } 210 }
209
210 for (const auto& pair : window_manager_state_map_)
211 pair.second->OnWillDestroyTree(tree);
212 } 211 }
213 212
214 void Display::UpdateNativeCursor(int32_t cursor_id) { 213 void Display::UpdateNativeCursor(int32_t cursor_id) {
215 if (cursor_id != last_cursor_) { 214 if (cursor_id != last_cursor_) {
216 platform_display_->SetCursorById(cursor_id); 215 platform_display_->SetCursorById(cursor_id);
217 last_cursor_ = cursor_id; 216 last_cursor_ = cursor_id;
218 } 217 }
219 } 218 }
220 219
221 void Display::SetSize(const gfx::Size& size) { 220 void Display::SetSize(const gfx::Size& size) {
222 platform_display_->SetViewportSize(size); 221 platform_display_->SetViewportSize(size);
223 } 222 }
224 223
225 void Display::SetTitle(const mojo::String& title) { 224 void Display::SetTitle(const mojo::String& title) {
226 platform_display_->SetTitle(title.To<base::string16>()); 225 platform_display_->SetTitle(title.To<base::string16>());
227 } 226 }
228 227
229 void Display::InitWindowManagersIfNecessary() { 228 void Display::InitWindowManagerDisplayRootsIfNecessary() {
230 if (!init_called_ || !root_) 229 if (!init_called_ || !root_)
231 return; 230 return;
232 231
233 display_manager()->OnDisplayAcceleratedWidgetAvailable(this); 232 display_manager()->OnDisplayAcceleratedWidgetAvailable(this);
234 if (binding_) { 233 if (binding_) {
235 std::unique_ptr<WindowManagerState> wms_ptr( 234 std::unique_ptr<WindowManagerDisplayRoot> display_root_ptr(
236 new WindowManagerState(this, platform_display_.get())); 235 new WindowManagerDisplayRoot(this));
237 WindowManagerState* wms = wms_ptr.get(); 236 WindowManagerDisplayRoot* display_root = display_root_ptr.get();
238 // For this case we never create additional WindowManagerStates, so any 237 // For this case we never create additional displays roots, so any
239 // id works. 238 // id works.
240 window_manager_state_map_[shell::mojom::kRootUserID] = std::move(wms_ptr); 239 window_manager_display_root_map_[shell::mojom::kRootUserID] =
241 wms->tree_ = binding_->CreateWindowTree(wms->root()); 240 std::move(display_root_ptr);
241 WindowTree* window_tree = binding_->CreateWindowTree(display_root->root());
242 display_root->window_manager_state_ = window_tree->window_manager_state();
242 } else { 243 } else {
243 CreateWindowManagerStatesFromFactories(); 244 CreateWindowManagerDisplayRootsFromFactories();
244 } 245 }
245 } 246 }
246 247
247 void Display::CreateWindowManagerStatesFromFactories() { 248 void Display::CreateWindowManagerDisplayRootsFromFactories() {
248 std::vector<WindowManagerWindowTreeFactory*> factories = 249 std::vector<WindowManagerWindowTreeFactory*> factories =
249 window_server_->window_manager_window_tree_factory_set()->GetFactories(); 250 window_server_->window_manager_window_tree_factory_set()->GetFactories();
250 for (WindowManagerWindowTreeFactory* factory : factories) { 251 for (WindowManagerWindowTreeFactory* factory : factories) {
251 if (factory->window_tree()) 252 if (factory->window_tree())
252 CreateWindowManagerStateFromFactory(factory); 253 CreateWindowManagerDisplayRootFromFactory(factory);
253 } 254 }
254 } 255 }
255 256
256 void Display::CreateWindowManagerStateFromFactory( 257 void Display::CreateWindowManagerDisplayRootFromFactory(
257 WindowManagerWindowTreeFactory* factory) { 258 WindowManagerWindowTreeFactory* factory) {
258 std::unique_ptr<WindowManagerState> wms_ptr(new WindowManagerState( 259 std::unique_ptr<WindowManagerDisplayRoot> display_root_ptr(
259 this, platform_display_.get(), factory->user_id())); 260 new WindowManagerDisplayRoot(this));
260 WindowManagerState* wms = wms_ptr.get(); 261 WindowManagerDisplayRoot* display_root = display_root_ptr.get();
261 window_manager_state_map_[factory->user_id()] = std::move(wms_ptr); 262 window_manager_display_root_map_[factory->user_id()] =
262 wms->tree_ = factory->window_tree(); 263 std::move(display_root_ptr);
263 if (!binding_) { 264 display_root->window_manager_state_ =
264 const bool is_active = 265 factory->window_tree()->window_manager_state();
265 factory->user_id() == window_server_->user_id_tracker()->active_id(); 266 const bool is_active =
266 wms->root()->SetVisible(is_active); 267 factory->user_id() == window_server_->user_id_tracker()->active_id();
267 wms->tree_->AddRootForWindowManager(wms->root()); 268 display_root->root()->SetVisible(is_active);
268 } 269 display_root->window_manager_state()->window_tree()->AddRootForWindowManager(
270 display_root->root());
269 } 271 }
270 272
271 ServerWindow* Display::GetRootWindow() { 273 ServerWindow* Display::GetRootWindow() {
272 return root_.get(); 274 return root_.get();
273 } 275 }
274 276
275 void Display::OnEvent(const ui::Event& event) { 277 void Display::OnEvent(const ui::Event& event) {
276 WindowManagerState* wms = GetActiveWindowManagerState(); 278 WindowManagerDisplayRoot* display_root = GetActiveWindowManagerDisplayRoot();
277 if (wms) 279 if (display_root)
278 wms->ProcessEvent(event); 280 display_root->window_manager_state()->ProcessEvent(event);
279 } 281 }
280 282
281 void Display::OnNativeCaptureLost() { 283 void Display::OnNativeCaptureLost() {
282 WindowManagerState* state = GetActiveWindowManagerState(); 284 WindowManagerDisplayRoot* display_root = GetActiveWindowManagerDisplayRoot();
283 if (state) 285 if (display_root)
284 state->SetCapture(nullptr, false); 286 display_root->window_manager_state()->SetCapture(nullptr, kInvalidClientId);
285 } 287 }
286 288
287 void Display::OnDisplayClosed() { 289 void Display::OnDisplayClosed() {
288 display_manager()->DestroyDisplay(this); 290 display_manager()->DestroyDisplay(this);
289 } 291 }
290 292
291 void Display::OnViewportMetricsChanged(const ViewportMetrics& old_metrics, 293 void Display::OnViewportMetricsChanged(const ViewportMetrics& old_metrics,
292 const ViewportMetrics& new_metrics) { 294 const ViewportMetrics& new_metrics) {
293 if (!root_) { 295 if (!root_) {
294 root_.reset(window_server_->CreateServerWindow( 296 root_.reset(window_server_->CreateServerWindow(
295 display_manager()->GetAndAdvanceNextRootId(), 297 display_manager()->GetAndAdvanceNextRootId(),
296 ServerWindow::Properties())); 298 ServerWindow::Properties()));
297 root_->SetBounds(gfx::Rect(new_metrics.size_in_pixels)); 299 root_->SetBounds(gfx::Rect(new_metrics.size_in_pixels));
298 root_->SetVisible(true); 300 root_->SetVisible(true);
299 focus_controller_.reset(new FocusController(this, root_.get())); 301 focus_controller_.reset(new FocusController(this, root_.get()));
300 focus_controller_->AddObserver(this); 302 focus_controller_->AddObserver(this);
301 InitWindowManagersIfNecessary(); 303 InitWindowManagerDisplayRootsIfNecessary();
302 } else { 304 } else {
303 root_->SetBounds(gfx::Rect(new_metrics.size_in_pixels)); 305 root_->SetBounds(gfx::Rect(new_metrics.size_in_pixels));
304 const gfx::Rect wm_bounds(root_->bounds().size()); 306 const gfx::Rect wm_bounds(root_->bounds().size());
305 for (auto& pair : window_manager_state_map_) 307 for (auto& pair : window_manager_display_root_map_)
306 pair.second->root()->SetBounds(wm_bounds); 308 pair.second->root()->SetBounds(wm_bounds);
307 } 309 }
308 display_manager()->OnDisplayUpdate(this); 310 display_manager()->OnDisplayUpdate(this);
309 } 311 }
310 312
311 void Display::OnCompositorFrameDrawn() { 313 void Display::OnCompositorFrameDrawn() {
312 std::set<ServerWindow*> windows; 314 std::set<ServerWindow*> windows;
313 windows.swap(windows_needing_frame_destruction_); 315 windows.swap(windows_needing_frame_destruction_);
314 for (ServerWindow* window : windows) { 316 for (ServerWindow* window : windows) {
315 window->RemoveObserver(this); 317 window->RemoveObserver(this);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 embedded_tree_new = window_server_->GetTreeWithRoot(new_focused_window); 375 embedded_tree_new = window_server_->GetTreeWithRoot(new_focused_window);
374 if (embedded_tree_new && embedded_tree_new != owning_tree_old && 376 if (embedded_tree_new && embedded_tree_new != owning_tree_old &&
375 embedded_tree_new != embedded_tree_old) { 377 embedded_tree_new != embedded_tree_old) {
376 DCHECK_NE(owning_tree_new, embedded_tree_new); 378 DCHECK_NE(owning_tree_new, embedded_tree_new);
377 embedded_tree_new->ProcessFocusChanged(old_focused_window, 379 embedded_tree_new->ProcessFocusChanged(old_focused_window,
378 new_focused_window); 380 new_focused_window);
379 } 381 }
380 } 382 }
381 383
382 // WindowManagers are always notified of focus changes. 384 // WindowManagers are always notified of focus changes.
383 WindowTree* wms_tree_with_old_focused_window = nullptr; 385 WindowManagerDisplayRoot* display_root = GetActiveWindowManagerDisplayRoot();
384 if (old_focused_window) { 386 if (display_root) {
385 WindowManagerState* wms = 387 WindowTree* wm_tree = display_root->window_manager_state()->window_tree();
386 display_manager() 388 if (wm_tree != owning_tree_old && wm_tree != embedded_tree_old &&
387 ->GetWindowManagerAndDisplay(old_focused_window) 389 wm_tree != owning_tree_new && wm_tree != embedded_tree_new) {
388 .window_manager_state; 390 wm_tree->ProcessFocusChanged(old_focused_window, new_focused_window);
389 wms_tree_with_old_focused_window = wms ? wms->tree() : nullptr;
390 if (wms_tree_with_old_focused_window &&
391 wms_tree_with_old_focused_window != owning_tree_old &&
392 wms_tree_with_old_focused_window != embedded_tree_old &&
393 wms_tree_with_old_focused_window != owning_tree_new &&
394 wms_tree_with_old_focused_window != embedded_tree_new) {
395 wms_tree_with_old_focused_window->ProcessFocusChanged(old_focused_window,
396 new_focused_window);
397 }
398 }
399 if (new_focused_window) {
400 WindowManagerState* wms =
401 display_manager()
402 ->GetWindowManagerAndDisplay(new_focused_window)
403 .window_manager_state;
404 WindowTree* wms_tree = wms ? wms->tree() : nullptr;
405 if (wms_tree && wms_tree != wms_tree_with_old_focused_window &&
406 wms_tree != owning_tree_old && wms_tree != embedded_tree_old &&
407 wms_tree != owning_tree_new && wms_tree != embedded_tree_new) {
408 wms_tree->ProcessFocusChanged(old_focused_window, new_focused_window);
409 } 391 }
410 } 392 }
411 393
412 UpdateTextInputState(new_focused_window, 394 UpdateTextInputState(new_focused_window,
413 new_focused_window->text_input_state()); 395 new_focused_window->text_input_state());
414 } 396 }
415 397
416 void Display::OnWindowDestroyed(ServerWindow* window) { 398 void Display::OnWindowDestroyed(ServerWindow* window) {
417 windows_needing_frame_destruction_.erase(window); 399 windows_needing_frame_destruction_.erase(window);
418 window->RemoveObserver(this); 400 window->RemoveObserver(this);
419 } 401 }
420 402
421 void Display::OnActiveUserIdChanged(const UserId& previously_active_id,
422 const UserId& active_id) {
423 if (binding_)
424 return;
425
426 WindowManagerState* previous_wms =
427 GetWindowManagerStateForUser(previously_active_id);
428 const gfx::Point mouse_location_on_screen =
429 previous_wms
430 ? previous_wms->event_dispatcher()->mouse_pointer_last_location()
431 : gfx::Point();
432 if (previous_wms)
433 previous_wms->Deactivate();
434
435 WindowManagerState* active_wms = GetWindowManagerStateForUser(active_id);
436 if (active_wms)
437 active_wms->Activate(mouse_location_on_screen);
438 }
439
440 void Display::OnUserIdAdded(const UserId& id) {}
441
442 void Display::OnUserIdRemoved(const UserId& id) { 403 void Display::OnUserIdRemoved(const UserId& id) {
443 if (binding_) 404 window_manager_display_root_map_.erase(id);
444 return;
445
446 WindowManagerState* state = GetWindowManagerStateForUser(id);
447 if (!state)
448 return;
449
450 // DestroyTree() calls back to OnWillDestroyTree() and the WindowManagerState
451 // is destroyed (and removed).
452 window_server_->DestroyTree(state->tree());
453 DCHECK_EQ(0u, window_manager_state_map_.count(id));
454 } 405 }
455 406
456 void Display::OnWindowManagerWindowTreeFactoryReady( 407 void Display::OnWindowManagerWindowTreeFactoryReady(
457 WindowManagerWindowTreeFactory* factory) { 408 WindowManagerWindowTreeFactory* factory) {
458 if (!binding_) 409 if (!binding_)
459 CreateWindowManagerStateFromFactory(factory); 410 CreateWindowManagerDisplayRootFromFactory(factory);
460 } 411 }
461 412
462 } // namespace ws 413 } // namespace ws
463 } // namespace mus 414 } // namespace mus
OLDNEW
« no previous file with comments | « components/mus/ws/display.h ('k') | components/mus/ws/display_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698