| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/shell_state.h" |
| |
| #include <memory> |
| #include <utility> |
| |
| #include "ash/shell.h" |
| #include "ash/ws/window_service_owner.h" |
| #include "services/ws/window_service.h" |
| #include "ui/display/display.h" |
| #include "ui/display/screen.h" |
| |
| namespace ash { |
| |
| ShellState::ShellState() = default; |
| |
| ShellState::~ShellState() = default; |
| |
| aura::Window* ShellState::GetRootWindowForNewWindows() const { |
| if (scoped_root_window_for_new_windows_) |
| return scoped_root_window_for_new_windows_; |
| return root_window_for_new_windows_; |
| } |
| |
| void ShellState::SetRootWindowForNewWindows(aura::Window* root) { |
| if (root == root_window_for_new_windows_) |
| return; |
| root_window_for_new_windows_ = root; |
| NotifyAllClients(); |
| } |
| |
| void ShellState::NotifyAllClients() { |
| const int64_t display_id = GetDisplayIdForNewWindows(); |
| display::Screen::GetScreen()->SetDisplayForNewWindows(display_id); |
| |
| // WindowService broadcasts the display id over mojo to all remote apps. |
| // TODO(jamescook): Move this into Shell when ShellState is removed. |
| WindowServiceOwner* ws_owner = Shell::Get()->window_service_owner(); |
| // |ws_owner| is null during shutdown and tests. |window_service()| is null |
| // during early startup. |
| if (ws_owner && ws_owner->window_service()) |
| ws_owner->window_service()->SetDisplayForNewWindows(display_id); |
| } |
| |
| int64_t ShellState::GetDisplayIdForNewWindows() const { |
| // GetDisplayNearestWindow() handles null. |
| return display::Screen::GetScreen() |
| ->GetDisplayNearestWindow(GetRootWindowForNewWindows()) |
| .id(); |
| } |
| |
| void ShellState::SetScopedRootWindowForNewWindows(aura::Window* root) { |
| if (root == scoped_root_window_for_new_windows_) |
| return; |
| // Only allow set and clear, not switch. |
| DCHECK(!scoped_root_window_for_new_windows_ || !root); |
| scoped_root_window_for_new_windows_ = root; |
| NotifyAllClients(); |
| } |
| |
| } // namespace ash |