| 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 "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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |