| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2016 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 #include "components/mus/ws/user_display_manager.h" |
| 6 |
| 7 #include "components/mus/ws/display.h" |
| 8 #include "components/mus/ws/display_manager.h" |
| 9 #include "components/mus/ws/window_manager_state.h" |
| 10 |
| 11 namespace mus { |
| 12 namespace ws { |
| 13 |
| 14 UserDisplayManager::UserDisplayManager(ws::DisplayManager* display_manager, |
| 15 const UserId& user_id) |
| 16 : display_manager_(display_manager), user_id_(user_id) { |
| 17 for (const WindowManagerState* wms : GetWindowManagerStatesForUser()) { |
| 18 if (wms->got_frame_decoration_values()) { |
| 19 got_valid_frame_decorations_ = true; |
| 20 break; |
| 21 } |
| 22 } |
| 23 } |
| 24 |
| 25 UserDisplayManager::~UserDisplayManager() {} |
| 26 |
| 27 void UserDisplayManager::OnFrameDecorationValuesChanged( |
| 28 WindowManagerState* wms) { |
| 29 if (!got_valid_frame_decorations_) { |
| 30 got_valid_frame_decorations_ = true; |
| 31 display_manager_observers_.ForAllPtrs([this]( |
| 32 mojom::DisplayManagerObserver* observer) { CallOnDisplays(observer); }); |
| 33 if (test_observer_) |
| 34 CallOnDisplays(test_observer_); |
| 35 return; |
| 36 } |
| 37 |
| 38 display_manager_observers_.ForAllPtrs( |
| 39 [this, &wms](mojom::DisplayManagerObserver* observer) { |
| 40 CallOnDisplayChanged(wms, observer); |
| 41 }); |
| 42 if (test_observer_) |
| 43 CallOnDisplayChanged(wms, test_observer_); |
| 44 } |
| 45 |
| 46 void UserDisplayManager::AddDisplayManagerBinding( |
| 47 mojo::InterfaceRequest<mojom::DisplayManager> request) { |
| 48 display_manager_bindings_.AddBinding(this, std::move(request)); |
| 49 } |
| 50 |
| 51 void UserDisplayManager::OnWillDestroyDisplay(Display* display) { |
| 52 if (!display->GetWindowManagerStateForUser(user_id_) |
| 53 ->got_frame_decoration_values()) { |
| 54 return; |
| 55 } |
| 56 |
| 57 display_manager_observers_.ForAllPtrs( |
| 58 [this, &display](mojom::DisplayManagerObserver* observer) { |
| 59 observer->OnDisplayRemoved(display->id()); |
| 60 }); |
| 61 if (test_observer_) |
| 62 test_observer_->OnDisplayRemoved(display->id()); |
| 63 } |
| 64 |
| 65 std::set<const WindowManagerState*> |
| 66 UserDisplayManager::GetWindowManagerStatesForUser() const { |
| 67 std::set<const WindowManagerState*> result; |
| 68 for (const Display* display : display_manager_->displays()) { |
| 69 const WindowManagerState* wms = |
| 70 display->GetWindowManagerStateForUser(user_id_); |
| 71 if (wms && wms->got_frame_decoration_values()) |
| 72 result.insert(wms); |
| 73 } |
| 74 return result; |
| 75 } |
| 76 |
| 77 void UserDisplayManager::OnObserverAdded( |
| 78 mojom::DisplayManagerObserver* observer) { |
| 79 // Many clients key off the frame decorations to size widgets. Wait for frame |
| 80 // decorations before notifying so that we don't have to worry about clients |
| 81 // resizing appropriately. |
| 82 if (!got_valid_frame_decorations_) |
| 83 return; |
| 84 |
| 85 CallOnDisplays(observer); |
| 86 } |
| 87 |
| 88 void UserDisplayManager::CallOnDisplays( |
| 89 mojom::DisplayManagerObserver* observer) { |
| 90 std::set<const WindowManagerState*> wmss = GetWindowManagerStatesForUser(); |
| 91 mojo::Array<mojom::DisplayPtr> display_ptrs(wmss.size()); |
| 92 { |
| 93 size_t i = 0; |
| 94 // TODO(sky): need ordering! |
| 95 for (const WindowManagerState* wms : wmss) { |
| 96 display_ptrs[i] = wms->ToMojomDisplay(); |
| 97 ++i; |
| 98 } |
| 99 } |
| 100 observer->OnDisplays(std::move(display_ptrs)); |
| 101 } |
| 102 |
| 103 void UserDisplayManager::CallOnDisplayChanged( |
| 104 WindowManagerState* wms, |
| 105 mojom::DisplayManagerObserver* observer) { |
| 106 mojo::Array<mojom::DisplayPtr> displays(1); |
| 107 displays[0] = wms->ToMojomDisplay(); |
| 108 display_manager_observers_.ForAllPtrs( |
| 109 [&displays](mojom::DisplayManagerObserver* observer) { |
| 110 observer->OnDisplaysChanged(displays.Clone()); |
| 111 }); |
| 112 if (test_observer_) |
| 113 test_observer_->OnDisplaysChanged(displays.Clone()); |
| 114 } |
| 115 |
| 116 void UserDisplayManager::AddObserver( |
| 117 mojom::DisplayManagerObserverPtr observer) { |
| 118 mojom::DisplayManagerObserver* observer_impl = observer.get(); |
| 119 display_manager_observers_.AddInterfacePtr(std::move(observer)); |
| 120 OnObserverAdded(observer_impl); |
| 121 } |
| 122 |
| 123 } // namespace ws |
| 124 } // namespace mus |
| OLD | NEW |