| // Copyright 2015 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 "mash/wm/shadow_controller.h" |
| |
| #include "components/mus/public/cpp/window.h" |
| #include "components/mus/public/cpp/window_tree_connection.h" |
| #include "mash/wm/property_util.h" |
| #include "mash/wm/shadow.h" |
| |
| namespace mash { |
| namespace wm { |
| namespace { |
| |
| // Returns the first ancestor of |from| (including |from|) that has a shadow. |
| mus::Window* FindAncestorWithShadow(mus::Window* from) { |
| mus::Window* result = from; |
| while (result && !GetShadow(result)) |
| result = result->parent(); |
| // Small shadows never change. |
| return result && GetShadow(result)->style() != Shadow::STYLE_SMALL ? result |
| : nullptr; |
| } |
| |
| } // namespace |
| |
| ShadowController::ShadowController(mus::WindowTreeConnection* window_tree) |
| : window_tree_(window_tree), active_window_(nullptr) { |
| window_tree_->AddObserver(this); |
| SetActiveWindow(FindAncestorWithShadow(window_tree_->GetFocusedWindow())); |
| } |
| |
| ShadowController::~ShadowController() { |
| window_tree_->RemoveObserver(this); |
| if (active_window_) |
| active_window_->RemoveObserver(this); |
| } |
| |
| void ShadowController::SetActiveWindow(mus::Window* window) { |
| if (window == active_window_) |
| return; |
| |
| if (active_window_) { |
| if (GetShadow(active_window_)) |
| GetShadow(active_window_)->SetStyle(Shadow::STYLE_INACTIVE); |
| active_window_->RemoveObserver(this); |
| } |
| active_window_ = window; |
| if (active_window_) { |
| GetShadow(active_window_)->SetStyle(Shadow::STYLE_ACTIVE); |
| active_window_->AddObserver(this); |
| } |
| } |
| |
| void ShadowController::OnWindowTreeFocusChanged(mus::Window* gained_focus, |
| mus::Window* lost_focus) { |
| SetActiveWindow(FindAncestorWithShadow(gained_focus)); |
| } |
| |
| void ShadowController::OnWindowDestroying(mus::Window* window) { |
| DCHECK_EQ(window, active_window_); |
| SetActiveWindow(nullptr); |
| } |
| |
| } // namespace wm |
| } // namespace mash |