| OLD | NEW |
| 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 "mash/wm/window_manager.h" | 5 #include "ash/mus/window_manager.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "ash/common/wm/container_finder.h" | 11 #include "ash/common/wm/container_finder.h" |
| 12 #include "ash/mus/bridge/wm_window_mus.h" |
| 13 #include "ash/mus/non_client_frame_controller.h" |
| 14 #include "ash/mus/property_util.h" |
| 15 #include "ash/mus/root_window_controller.h" |
| 12 #include "ash/public/interfaces/container.mojom.h" | 16 #include "ash/public/interfaces/container.mojom.h" |
| 13 #include "components/mus/common/types.h" | 17 #include "components/mus/common/types.h" |
| 14 #include "components/mus/public/cpp/property_type_converters.h" | 18 #include "components/mus/public/cpp/property_type_converters.h" |
| 15 #include "components/mus/public/cpp/window.h" | 19 #include "components/mus/public/cpp/window.h" |
| 16 #include "components/mus/public/cpp/window_property.h" | 20 #include "components/mus/public/cpp/window_property.h" |
| 17 #include "components/mus/public/cpp/window_tree_client.h" | 21 #include "components/mus/public/cpp/window_tree_client.h" |
| 18 #include "components/mus/public/interfaces/input_events.mojom.h" | 22 #include "components/mus/public/interfaces/input_events.mojom.h" |
| 19 #include "components/mus/public/interfaces/mus_constants.mojom.h" | 23 #include "components/mus/public/interfaces/mus_constants.mojom.h" |
| 20 #include "components/mus/public/interfaces/window_manager.mojom.h" | 24 #include "components/mus/public/interfaces/window_manager.mojom.h" |
| 21 #include "mash/wm/bridge/wm_window_mus.h" | |
| 22 #include "mash/wm/non_client_frame_controller.h" | |
| 23 #include "mash/wm/property_util.h" | |
| 24 #include "mash/wm/root_window_controller.h" | |
| 25 | 25 |
| 26 namespace mash { | 26 namespace ash { |
| 27 namespace wm { | 27 namespace mus { |
| 28 | 28 |
| 29 WindowManager::WindowManager() | 29 WindowManager::WindowManager() |
| 30 : root_controller_(nullptr), | 30 : root_controller_(nullptr), |
| 31 window_manager_client_(nullptr), | 31 window_manager_client_(nullptr), |
| 32 binding_(this) {} | 32 binding_(this) {} |
| 33 | 33 |
| 34 WindowManager::~WindowManager() { | 34 WindowManager::~WindowManager() {} |
| 35 } | |
| 36 | 35 |
| 37 void WindowManager::Initialize(RootWindowController* root_controller, | 36 void WindowManager::Initialize(RootWindowController* root_controller, |
| 38 session::mojom::Session* session) { | 37 mash::session::mojom::Session* session) { |
| 39 DCHECK(root_controller); | 38 DCHECK(root_controller); |
| 40 DCHECK(!root_controller_); | 39 DCHECK(!root_controller_); |
| 41 root_controller_ = root_controller; | 40 root_controller_ = root_controller; |
| 42 | 41 |
| 43 // Observe all the containers so that windows can be added to/removed from the | 42 // Observe all the containers so that windows can be added to/removed from the |
| 44 // |disconnected_app_handler_|. | 43 // |disconnected_app_handler_|. |
| 45 int count = static_cast<int>(ash::mojom::Container::COUNT); | 44 int count = static_cast<int>(mojom::Container::COUNT); |
| 46 for (int id = static_cast<int>(ash::mojom::Container::ROOT) + 1; id < count; | 45 for (int id = static_cast<int>(mojom::Container::ROOT) + 1; id < count; |
| 47 ++id) { | 46 ++id) { |
| 48 mus::Window* container = root_controller_->GetWindowForContainer( | 47 ::mus::Window* container = root_controller_->GetWindowForContainer( |
| 49 static_cast<ash::mojom::Container>(id)); | 48 static_cast<mojom::Container>(id)); |
| 50 Add(container); | 49 Add(container); |
| 51 | 50 |
| 52 // Add any pre-existing windows in the container to | 51 // Add any pre-existing windows in the container to |
| 53 // |disconnected_app_handler_|. | 52 // |disconnected_app_handler_|. |
| 54 for (auto child : container->children()) { | 53 for (auto child : container->children()) { |
| 55 if (!root_controller_->WindowIsContainer(child)) | 54 if (!root_controller_->WindowIsContainer(child)) |
| 56 disconnected_app_handler_.Add(child); | 55 disconnected_app_handler_.Add(child); |
| 57 } | 56 } |
| 58 } | 57 } |
| 59 | 58 |
| 60 // The insets are roughly what is needed by CustomFrameView. The expectation | 59 // The insets are roughly what is needed by CustomFrameView. The expectation |
| 61 // is at some point we'll write our own NonClientFrameView and get the insets | 60 // is at some point we'll write our own NonClientFrameView and get the insets |
| 62 // from it. | 61 // from it. |
| 63 mus::mojom::FrameDecorationValuesPtr frame_decoration_values = | 62 ::mus::mojom::FrameDecorationValuesPtr frame_decoration_values = |
| 64 mus::mojom::FrameDecorationValues::New(); | 63 ::mus::mojom::FrameDecorationValues::New(); |
| 65 const gfx::Insets client_area_insets = | 64 const gfx::Insets client_area_insets = |
| 66 NonClientFrameController::GetPreferredClientAreaInsets(); | 65 NonClientFrameController::GetPreferredClientAreaInsets(); |
| 67 frame_decoration_values->normal_client_area_insets = client_area_insets; | 66 frame_decoration_values->normal_client_area_insets = client_area_insets; |
| 68 frame_decoration_values->maximized_client_area_insets = client_area_insets; | 67 frame_decoration_values->maximized_client_area_insets = client_area_insets; |
| 69 frame_decoration_values->max_title_bar_button_width = | 68 frame_decoration_values->max_title_bar_button_width = |
| 70 NonClientFrameController::GetMaxTitleBarButtonWidth(); | 69 NonClientFrameController::GetMaxTitleBarButtonWidth(); |
| 71 window_manager_client_->SetFrameDecorationValues( | 70 window_manager_client_->SetFrameDecorationValues( |
| 72 std::move(frame_decoration_values)); | 71 std::move(frame_decoration_values)); |
| 73 | 72 |
| 74 if (session) | 73 if (session) |
| 75 session->AddScreenlockStateListener(binding_.CreateInterfacePtrAndBind()); | 74 session->AddScreenlockStateListener(binding_.CreateInterfacePtrAndBind()); |
| 76 } | 75 } |
| 77 | 76 |
| 78 mus::Window* WindowManager::NewTopLevelWindow( | 77 ::mus::Window* WindowManager::NewTopLevelWindow( |
| 79 std::map<std::string, std::vector<uint8_t>>* properties) { | 78 std::map<std::string, std::vector<uint8_t>>* properties) { |
| 80 DCHECK(root_controller_); | 79 DCHECK(root_controller_); |
| 81 mus::Window* root = root_controller_->root(); | 80 ::mus::Window* root = root_controller_->root(); |
| 82 DCHECK(root); | 81 DCHECK(root); |
| 83 | 82 |
| 84 // TODO(sky): panels need a different frame, http:://crbug.com/614362. | 83 // TODO(sky): panels need a different frame, http:://crbug.com/614362. |
| 85 const bool provide_non_client_frame = | 84 const bool provide_non_client_frame = |
| 86 GetWindowType(*properties) == mus::mojom::WindowType::WINDOW || | 85 GetWindowType(*properties) == ::mus::mojom::WindowType::WINDOW || |
| 87 GetWindowType(*properties) == mus::mojom::WindowType::PANEL; | 86 GetWindowType(*properties) == ::mus::mojom::WindowType::PANEL; |
| 88 if (provide_non_client_frame) | 87 if (provide_non_client_frame) |
| 89 (*properties)[mus::mojom::kWaitForUnderlay_Property].clear(); | 88 (*properties)[::mus::mojom::kWaitForUnderlay_Property].clear(); |
| 90 | 89 |
| 91 // TODO(sky): constrain and validate properties before passing to server. | 90 // TODO(sky): constrain and validate properties before passing to server. |
| 92 mus::Window* window = root->window_tree()->NewWindow(properties); | 91 ::mus::Window* window = root->window_tree()->NewWindow(properties); |
| 93 window->SetBounds(CalculateDefaultBounds(window)); | 92 window->SetBounds(CalculateDefaultBounds(window)); |
| 94 | 93 |
| 95 mus::Window* container_window = nullptr; | 94 ::mus::Window* container_window = nullptr; |
| 96 if (window->HasSharedProperty(ash::mojom::kWindowContainer_Property)) { | 95 if (window->HasSharedProperty(mojom::kWindowContainer_Property)) { |
| 97 container_window = | 96 container_window = |
| 98 root_controller_->GetWindowForContainer(GetRequestedContainer(window)); | 97 root_controller_->GetWindowForContainer(GetRequestedContainer(window)); |
| 99 } else { | 98 } else { |
| 100 // TODO(sky): window->bounds() isn't quite right. | 99 // TODO(sky): window->bounds() isn't quite right. |
| 101 container_window = WmWindowMus::GetMusWindow( | 100 container_window = WmWindowMus::GetMusWindow( |
| 102 ash::wm::GetDefaultParent(WmWindowMus::Get(root_controller_->root()), | 101 wm::GetDefaultParent(WmWindowMus::Get(root_controller_->root()), |
| 103 WmWindowMus::Get(window), window->bounds())); | 102 WmWindowMus::Get(window), window->bounds())); |
| 104 } | 103 } |
| 105 DCHECK(root_controller_->WindowIsContainer(container_window)); | 104 DCHECK(root_controller_->WindowIsContainer(container_window)); |
| 106 | 105 |
| 107 if (provide_non_client_frame) { | 106 if (provide_non_client_frame) { |
| 108 NonClientFrameController::Create(root_controller_->GetConnector(), | 107 NonClientFrameController::Create(root_controller_->GetConnector(), |
| 109 container_window, window, | 108 container_window, window, |
| 110 root_controller_->window_manager_client()); | 109 root_controller_->window_manager_client()); |
| 111 } else { | 110 } else { |
| 112 container_window->AddChild(window); | 111 container_window->AddChild(window); |
| 113 } | 112 } |
| 114 | 113 |
| 115 root_controller_->IncrementWindowCount(); | 114 root_controller_->IncrementWindowCount(); |
| 116 | 115 |
| 117 return window; | 116 return window; |
| 118 } | 117 } |
| 119 | 118 |
| 120 gfx::Rect WindowManager::CalculateDefaultBounds(mus::Window* window) const { | 119 gfx::Rect WindowManager::CalculateDefaultBounds(::mus::Window* window) const { |
| 121 if (window->HasSharedProperty( | 120 if (window->HasSharedProperty( |
| 122 mus::mojom::WindowManager::kInitialBounds_Property)) { | 121 ::mus::mojom::WindowManager::kInitialBounds_Property)) { |
| 123 return window->GetSharedProperty<gfx::Rect>( | 122 return window->GetSharedProperty<gfx::Rect>( |
| 124 mus::mojom::WindowManager::kInitialBounds_Property); | 123 ::mus::mojom::WindowManager::kInitialBounds_Property); |
| 125 } | 124 } |
| 126 | 125 |
| 127 DCHECK(root_controller_); | 126 DCHECK(root_controller_); |
| 128 int width, height; | 127 int width, height; |
| 129 const gfx::Size pref = GetWindowPreferredSize(window); | 128 const gfx::Size pref = GetWindowPreferredSize(window); |
| 130 const mus::Window* root = root_controller_->root(); | 129 const ::mus::Window* root = root_controller_->root(); |
| 131 if (pref.IsEmpty()) { | 130 if (pref.IsEmpty()) { |
| 132 width = root->bounds().width() - 240; | 131 width = root->bounds().width() - 240; |
| 133 height = root->bounds().height() - 240; | 132 height = root->bounds().height() - 240; |
| 134 } else { | 133 } else { |
| 135 // TODO(sky): likely want to constrain more than root size. | 134 // TODO(sky): likely want to constrain more than root size. |
| 136 const gfx::Size max_size = GetMaximizedWindowBounds().size(); | 135 const gfx::Size max_size = GetMaximizedWindowBounds().size(); |
| 137 width = std::max(0, std::min(max_size.width(), pref.width())); | 136 width = std::max(0, std::min(max_size.width(), pref.width())); |
| 138 height = std::max(0, std::min(max_size.height(), pref.height())); | 137 height = std::max(0, std::min(max_size.height(), pref.height())); |
| 139 } | 138 } |
| 140 return gfx::Rect(40 + (root_controller_->window_count() % 4) * 40, | 139 return gfx::Rect(40 + (root_controller_->window_count() % 4) * 40, |
| 141 40 + (root_controller_->window_count() % 4) * 40, width, | 140 40 + (root_controller_->window_count() % 4) * 40, width, |
| 142 height); | 141 height); |
| 143 } | 142 } |
| 144 | 143 |
| 145 gfx::Rect WindowManager::GetMaximizedWindowBounds() const { | 144 gfx::Rect WindowManager::GetMaximizedWindowBounds() const { |
| 146 DCHECK(root_controller_); | 145 DCHECK(root_controller_); |
| 147 return gfx::Rect(root_controller_->root()->bounds().size()); | 146 return gfx::Rect(root_controller_->root()->bounds().size()); |
| 148 } | 147 } |
| 149 | 148 |
| 150 void WindowManager::OnTreeChanging(const TreeChangeParams& params) { | 149 void WindowManager::OnTreeChanging(const TreeChangeParams& params) { |
| 151 DCHECK(root_controller_); | 150 DCHECK(root_controller_); |
| 152 if (params.old_parent == params.receiver && | 151 if (params.old_parent == params.receiver && |
| 153 root_controller_->WindowIsContainer(params.old_parent)) | 152 root_controller_->WindowIsContainer(params.old_parent)) |
| 154 disconnected_app_handler_.Remove(params.target); | 153 disconnected_app_handler_.Remove(params.target); |
| 155 | 154 |
| 156 if (params.new_parent == params.receiver && | 155 if (params.new_parent == params.receiver && |
| 157 root_controller_->WindowIsContainer(params.new_parent)) | 156 root_controller_->WindowIsContainer(params.new_parent)) |
| 158 disconnected_app_handler_.Add(params.target); | 157 disconnected_app_handler_.Add(params.target); |
| 159 | 158 |
| 160 mus::WindowTracker::OnTreeChanging(params); | 159 ::mus::WindowTracker::OnTreeChanging(params); |
| 161 } | 160 } |
| 162 | 161 |
| 163 void WindowManager::SetWindowManagerClient(mus::WindowManagerClient* client) { | 162 void WindowManager::SetWindowManagerClient(::mus::WindowManagerClient* client) { |
| 164 window_manager_client_ = client; | 163 window_manager_client_ = client; |
| 165 } | 164 } |
| 166 | 165 |
| 167 bool WindowManager::OnWmSetBounds(mus::Window* window, gfx::Rect* bounds) { | 166 bool WindowManager::OnWmSetBounds(::mus::Window* window, gfx::Rect* bounds) { |
| 168 // TODO(sky): this indirectly sets bounds, which is against what | 167 // TODO(sky): this indirectly sets bounds, which is against what |
| 169 // OnWmSetBounds() recommends doing. Remove that restriction, or fix this. | 168 // OnWmSetBounds() recommends doing. Remove that restriction, or fix this. |
| 170 WmWindowMus::Get(window)->SetBounds(*bounds); | 169 WmWindowMus::Get(window)->SetBounds(*bounds); |
| 171 *bounds = window->bounds(); | 170 *bounds = window->bounds(); |
| 172 return true; | 171 return true; |
| 173 } | 172 } |
| 174 | 173 |
| 175 bool WindowManager::OnWmSetProperty( | 174 bool WindowManager::OnWmSetProperty( |
| 176 mus::Window* window, | 175 ::mus::Window* window, |
| 177 const std::string& name, | 176 const std::string& name, |
| 178 std::unique_ptr<std::vector<uint8_t>>* new_data) { | 177 std::unique_ptr<std::vector<uint8_t>>* new_data) { |
| 179 // TODO(sky): constrain this to set of keys we know about, and allowed | 178 // TODO(sky): constrain this to set of keys we know about, and allowed |
| 180 // values. | 179 // values. |
| 181 return name == mus::mojom::WindowManager::kShowState_Property || | 180 return name == ::mus::mojom::WindowManager::kShowState_Property || |
| 182 name == mus::mojom::WindowManager::kPreferredSize_Property || | 181 name == ::mus::mojom::WindowManager::kPreferredSize_Property || |
| 183 name == mus::mojom::WindowManager::kResizeBehavior_Property || | 182 name == ::mus::mojom::WindowManager::kResizeBehavior_Property || |
| 184 name == mus::mojom::WindowManager::kWindowAppIcon_Property || | 183 name == ::mus::mojom::WindowManager::kWindowAppIcon_Property || |
| 185 name == mus::mojom::WindowManager::kWindowTitle_Property; | 184 name == ::mus::mojom::WindowManager::kWindowTitle_Property; |
| 186 } | 185 } |
| 187 | 186 |
| 188 mus::Window* WindowManager::OnWmCreateTopLevelWindow( | 187 ::mus::Window* WindowManager::OnWmCreateTopLevelWindow( |
| 189 std::map<std::string, std::vector<uint8_t>>* properties) { | 188 std::map<std::string, std::vector<uint8_t>>* properties) { |
| 190 return NewTopLevelWindow(properties); | 189 return NewTopLevelWindow(properties); |
| 191 } | 190 } |
| 192 | 191 |
| 193 void WindowManager::OnWmClientJankinessChanged( | 192 void WindowManager::OnWmClientJankinessChanged( |
| 194 const std::set<mus::Window*>& client_windows, | 193 const std::set<::mus::Window*>& client_windows, |
| 195 bool janky) { | 194 bool janky) { |
| 196 for (auto window : client_windows) | 195 for (auto window : client_windows) |
| 197 SetWindowIsJanky(window, janky); | 196 SetWindowIsJanky(window, janky); |
| 198 } | 197 } |
| 199 | 198 |
| 200 void WindowManager::OnAccelerator(uint32_t id, const ui::Event& event) { | 199 void WindowManager::OnAccelerator(uint32_t id, const ui::Event& event) { |
| 201 root_controller_->OnAccelerator(id, std::move(event)); | 200 root_controller_->OnAccelerator(id, std::move(event)); |
| 202 } | 201 } |
| 203 | 202 |
| 204 void WindowManager::ScreenlockStateChanged(bool locked) { | 203 void WindowManager::ScreenlockStateChanged(bool locked) { |
| 205 // Hide USER_PRIVATE_CONTAINER windows when the screen is locked. | 204 // Hide USER_PRIVATE_CONTAINER windows when the screen is locked. |
| 206 mus::Window* window = root_controller_->GetWindowForContainer( | 205 ::mus::Window* window = |
| 207 ash::mojom::Container::USER_PRIVATE); | 206 root_controller_->GetWindowForContainer(mojom::Container::USER_PRIVATE); |
| 208 window->SetVisible(!locked); | 207 window->SetVisible(!locked); |
| 209 } | 208 } |
| 210 | 209 |
| 211 } // namespace wm | 210 } // namespace mus |
| 212 } // namespace mash | 211 } // namespace ash |
| OLD | NEW |