blob: d8fafbfd5ad9c9502a2c7257a7cc6a4d71783c13 [file] [log] [blame]
// 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