1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ash/wm/always_on_top_controller.h" 6 7 #include "ash/shell.h" 8 #include "ash/shell_window_ids.h" 9 #include "ash/wm/property_util.h" 10 #include "ui/aura/client/aura_constants.h" 11 #include "ui/aura/window.h" 12 13 namespace ash { 14 namespace internal { 15 16 AlwaysOnTopController::AlwaysOnTopController() 17 : always_on_top_container_(NULL) { 18 } 19 20 AlwaysOnTopController::~AlwaysOnTopController() { 21 if (always_on_top_container_) 22 always_on_top_container_->RemoveObserver(this); 23 } 24 25 void AlwaysOnTopController::SetAlwaysOnTopContainer( 26 aura::Window* always_on_top_container) { 27 // Container should be empty. 28 DCHECK(always_on_top_container->children().empty()); 29 30 // We are not handling any containers yet. 31 DCHECK(always_on_top_container_ == NULL); 32 33 always_on_top_container_ = always_on_top_container; 34 always_on_top_container_->AddObserver(this); 35 } 36 37 aura::Window* AlwaysOnTopController::GetContainer(aura::Window* window) const { 38 DCHECK(always_on_top_container_); 39 if (window->GetProperty(aura::client::kAlwaysOnTopKey)) 40 return always_on_top_container_; 41 return Shell::GetContainer(always_on_top_container_->GetRootWindow(), 42 kShellWindowId_DefaultContainer); 43 } 44 45 void AlwaysOnTopController::OnWindowAdded(aura::Window* child) { 46 // Observe direct child of the containers. 47 if (child->parent() == always_on_top_container_) 48 child->AddObserver(this); 49 } 50 51 void AlwaysOnTopController::OnWillRemoveWindow(aura::Window* child) { 52 child->RemoveObserver(this); 53 } 54 55 void AlwaysOnTopController::OnWindowPropertyChanged(aura::Window* window, 56 const void* key, 57 intptr_t old) { 58 if (key == aura::client::kAlwaysOnTopKey) { 59 DCHECK(window->type() == aura::client::WINDOW_TYPE_NORMAL || 60 window->type() == aura::client::WINDOW_TYPE_POPUP); 61 aura::Window* container = GetContainer(window); 62 if (window->parent() != container) 63 container->AddChild(window); 64 } 65 } 66 67 void AlwaysOnTopController::OnWindowDestroyed(aura::Window* window) { 68 if (window == always_on_top_container_) 69 always_on_top_container_ = NULL; 70 } 71 72 } // namespace internal 73 } // namespace ash 74