// Copyright (c) 2012 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/wm/always_on_top_controller.h" #include "ash/root_window_controller.h" #include "ash/wm/property_util.h" #include "ash/wm/workspace_controller.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/window.h" namespace ash { namespace internal { AlwaysOnTopController::AlwaysOnTopController() : always_on_top_container_(NULL) { } AlwaysOnTopController::~AlwaysOnTopController() { if (always_on_top_container_) always_on_top_container_->RemoveObserver(this); } void AlwaysOnTopController::SetAlwaysOnTopContainer( aura::Window* always_on_top_container) { // Container should be empty. DCHECK(always_on_top_container->children().empty()); // We are not handling any containers yet. DCHECK(always_on_top_container_ == NULL); always_on_top_container_ = always_on_top_container; always_on_top_container_->AddObserver(this); } aura::Window* AlwaysOnTopController::GetContainer(aura::Window* window) const { DCHECK(always_on_top_container_); if (window->GetProperty(aura::client::kAlwaysOnTopKey)) return always_on_top_container_; return GetRootWindowController(always_on_top_container_->GetRootWindow())-> workspace_controller()->GetParentForNewWindow(window); } void AlwaysOnTopController::OnWindowAdded(aura::Window* child) { // Observe direct child of the containers. if (child->parent() == always_on_top_container_) child->AddObserver(this); } void AlwaysOnTopController::OnWillRemoveWindow(aura::Window* child) { child->RemoveObserver(this); } void AlwaysOnTopController::OnWindowPropertyChanged(aura::Window* window, const void* key, intptr_t old) { if (key == aura::client::kAlwaysOnTopKey) { DCHECK(window->type() == aura::client::WINDOW_TYPE_NORMAL || window->type() == aura::client::WINDOW_TYPE_POPUP); aura::Window* container = GetContainer(window); if (window->parent() != container) container->AddChild(window); } } void AlwaysOnTopController::OnWindowDestroyed(aura::Window* window) { if (window == always_on_top_container_) always_on_top_container_ = NULL; } } // namespace internal } // namespace ash