15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/always_on_top_controller.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ash/shell.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ash/shell_window_ids.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/property_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AlwaysOnTopController::AlwaysOnTopController()
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : always_on_top_container_(NULL) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AlwaysOnTopController::~AlwaysOnTopController() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (always_on_top_container_)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    always_on_top_container_->RemoveObserver(this);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AlwaysOnTopController::SetAlwaysOnTopContainer(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* always_on_top_container) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Container should be empty.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(always_on_top_container->children().empty());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We are not handling any containers yet.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(always_on_top_container_ == NULL);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  always_on_top_container_ = always_on_top_container;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  always_on_top_container_->AddObserver(this);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)aura::Window* AlwaysOnTopController::GetContainer(aura::Window* window) const {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(always_on_top_container_);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (window->GetProperty(aura::client::kAlwaysOnTopKey))
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return always_on_top_container_;
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return Shell::GetContainer(always_on_top_container_->GetRootWindow(),
422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                             kShellWindowId_DefaultContainer);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AlwaysOnTopController::OnWindowAdded(aura::Window* child) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observe direct child of the containers.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (child->parent() == always_on_top_container_)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child->AddObserver(this);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AlwaysOnTopController::OnWillRemoveWindow(aura::Window* child) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  child->RemoveObserver(this);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AlwaysOnTopController::OnWindowPropertyChanged(aura::Window* window,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    const void* key,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    intptr_t old) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key == aura::client::kAlwaysOnTopKey) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(window->type() == aura::client::WINDOW_TYPE_NORMAL ||
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           window->type() == aura::client::WINDOW_TYPE_POPUP);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* container = GetContainer(window);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (window->parent() != container)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      container->AddChild(window);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AlwaysOnTopController::OnWindowDestroyed(aura::Window* window) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (window == always_on_top_container_)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    always_on_top_container_ = NULL;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
74