Index: ash/wm/screen_pinning_controller.cc |
diff --git a/ash/wm/screen_pinning_controller.cc b/ash/wm/screen_pinning_controller.cc |
index 10f55528a0b490b2a2d7287233e6ba60411774c5..7a0e1224df87f0126f012836c1a10f49aa138b93 100644 |
--- a/ash/wm/screen_pinning_controller.cc |
+++ b/ash/wm/screen_pinning_controller.cc |
@@ -11,18 +11,21 @@ |
#include "ash/common/wm/window_dimmer.h" |
#include "ash/common/wm/window_state.h" |
#include "ash/common/wm_window.h" |
-#include "ash/common/wm_window_user_data.h" |
#include "ash/display/window_tree_host_manager.h" |
#include "ash/public/cpp/shell_window_ids.h" |
#include "ash/shell.h" |
#include "base/auto_reset.h" |
#include "base/logging.h" |
#include "base/memory/ptr_util.h" |
+#include "ui/aura/window.h" |
#include "ui/aura/window_observer.h" |
+#include "ui/wm/core/window_util.h" |
namespace ash { |
namespace { |
+DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(WindowDimmer, kWindowDimmerKey, nullptr); |
+ |
// Returns a list of WmWindows corresponding to SystemModalContainers, |
// except ones whose root is shared with |pinned_window|. |
std::vector<WmWindow*> GetSystemModalWindowsExceptPinned( |
@@ -30,11 +33,11 @@ std::vector<WmWindow*> GetSystemModalWindowsExceptPinned( |
WmWindow* pinned_root = pinned_window->GetRootWindow(); |
std::vector<WmWindow*> result; |
- for (WmWindow* system_modal : wm::GetContainersFromAllRootWindows( |
+ for (aura::Window* system_modal : wm::GetContainersFromAllRootWindows( |
kShellWindowId_SystemModalContainer)) { |
- if (system_modal->GetRootWindow() == pinned_root) |
+ if (WmWindow::Get(system_modal)->GetRootWindow() == pinned_root) |
continue; |
- result.push_back(system_modal); |
+ result.push_back(WmWindow::Get(system_modal)); |
} |
return result; |
} |
@@ -142,8 +145,7 @@ class ScreenPinningController::SystemModalContainerWindowObserver |
ScreenPinningController::ScreenPinningController( |
WindowTreeHostManager* window_tree_host_manager) |
- : window_dimmers_(base::MakeUnique<WmWindowUserData<WindowDimmer>>()), |
- window_tree_host_manager_(window_tree_host_manager), |
+ : window_tree_host_manager_(window_tree_host_manager), |
pinned_container_window_observer_( |
base::MakeUnique<PinnedContainerWindowObserver>(this)), |
pinned_container_child_window_observer_( |
@@ -164,7 +166,9 @@ bool ScreenPinningController::IsPinned() const { |
} |
void ScreenPinningController::SetPinnedWindow(WmWindow* pinned_window) { |
- window_dimmers_->clear(); |
+ for (aura::Window* window : windows_with_dimmers_.windows()) |
+ window->ClearProperty(kWindowDimmerKey); |
+ windows_with_dimmers_.RemoveAll(); |
if (pinned_window->GetWindowState()->IsPinned()) { |
if (pinned_window_) { |
@@ -270,12 +274,15 @@ void ScreenPinningController::OnSystemModalContainerWindowStackingChanged( |
WmWindow* ScreenPinningController::CreateWindowDimmer(WmWindow* container) { |
std::unique_ptr<WindowDimmer> window_dimmer = |
- base::MakeUnique<WindowDimmer>(container); |
+ base::MakeUnique<WindowDimmer>(container->aura_window()); |
window_dimmer->SetDimOpacity(1); // Fully opaque. |
- window_dimmer->window()->SetFullscreen(true); |
+ ::wm::SetWindowFullscreen(window_dimmer->window(), true); |
window_dimmer->window()->Show(); |
- WmWindow* window = window_dimmer->window(); |
- window_dimmers_->Set(container, std::move(window_dimmer)); |
+ WmWindow* window = WmWindow::Get(window_dimmer->window()); |
+ // |container| takes ownership of |window_dimmer|. |
+ container->aura_window()->SetProperty(kWindowDimmerKey, |
+ window_dimmer.release()); |
+ windows_with_dimmers_.Add(container->aura_window()); |
return window; |
} |
@@ -292,10 +299,17 @@ void ScreenPinningController::OnDisplayConfigurationChanged() { |
// WindowDimmer. So create it. |
// First, delete unnecessary WindowDimmers. |
- for (WmWindow* container : window_dimmers_->GetWindows()) { |
- if (container != pinned_window_->GetParent() && |
- !window_dimmers_->Get(container)->window()->GetTargetVisibility()) { |
- window_dimmers_->Set(container, nullptr); |
+ { |
+ aura::Window::Windows windows = windows_with_dimmers_.windows(); |
+ for (aura::Window* container : windows) { |
+ if (WmWindow::Get(container) != pinned_window_->GetParent() && |
+ container->GetProperty(kWindowDimmerKey) |
+ ->window() |
+ ->layer() |
+ ->GetTargetVisibility()) { |
+ windows_with_dimmers_.Remove(container); |
+ container->ClearProperty(kWindowDimmerKey); |
+ } |
} |
} |
@@ -303,7 +317,7 @@ void ScreenPinningController::OnDisplayConfigurationChanged() { |
std::vector<WmWindow*> system_modal_containers = |
GetSystemModalWindowsExceptPinned(pinned_window_); |
for (WmWindow* system_modal : system_modal_containers) { |
- if (window_dimmers_->Get(system_modal)) { |
+ if (system_modal->aura_window()->GetProperty(kWindowDimmerKey)) { |
// |system_modal| already has a WindowDimmer. |
continue; |
} |
@@ -326,19 +340,23 @@ void ScreenPinningController::KeepPinnedWindowOnTop() { |
base::AutoReset<bool> auto_reset(&in_restacking_, true); |
WmWindow* container = pinned_window_->GetParent(); |
container->StackChildAtTop(pinned_window_); |
- WindowDimmer* pinned_window_dimmer = window_dimmers_->Get(container); |
- if (pinned_window_dimmer && pinned_window_dimmer->window()) |
- container->StackChildBelow(pinned_window_dimmer->window(), pinned_window_); |
+ WindowDimmer* pinned_window_dimmer = |
+ container->aura_window()->GetProperty(kWindowDimmerKey); |
+ if (pinned_window_dimmer && pinned_window_dimmer->window()) { |
+ container->StackChildBelow(WmWindow::Get(pinned_window_dimmer->window()), |
+ pinned_window_); |
+ } |
} |
void ScreenPinningController::KeepDimWindowAtBottom(WmWindow* container) { |
if (in_restacking_) |
return; |
- WindowDimmer* window_dimmer = window_dimmers_->Get(container); |
+ WindowDimmer* window_dimmer = |
+ container->aura_window()->GetProperty(kWindowDimmerKey); |
if (window_dimmer) { |
base::AutoReset<bool> auto_reset(&in_restacking_, true); |
- container->StackChildAtBottom(window_dimmer->window()); |
+ container->StackChildAtBottom(WmWindow::Get(window_dimmer->window())); |
} |
} |