| Index: ui/aura_shell/activation_controller.cc
|
| ===================================================================
|
| --- ui/aura_shell/activation_controller.cc (revision 114099)
|
| +++ ui/aura_shell/activation_controller.cc (working copy)
|
| @@ -1,185 +0,0 @@
|
| -// Copyright (c) 2011 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 "ui/aura_shell/activation_controller.h"
|
| -
|
| -#include "base/auto_reset.h"
|
| -#include "ui/aura/client/activation_delegate.h"
|
| -#include "ui/aura/client/aura_constants.h"
|
| -#include "ui/aura/root_window.h"
|
| -#include "ui/aura/window.h"
|
| -#include "ui/aura/window_delegate.h"
|
| -#include "ui/aura_shell/shell.h"
|
| -#include "ui/aura_shell/shell_window_ids.h"
|
| -#include "ui/aura_shell/window_util.h"
|
| -
|
| -namespace aura_shell {
|
| -namespace internal {
|
| -namespace {
|
| -
|
| -aura::Window* GetContainer(int id) {
|
| - return Shell::GetInstance()->GetContainer(id);
|
| -}
|
| -
|
| -// Returns true if children of |window| can be activated.
|
| -bool SupportsChildActivation(aura::Window* window) {
|
| - return window->id() == kShellWindowId_DefaultContainer ||
|
| - window->id() == kShellWindowId_AlwaysOnTopContainer ||
|
| - window->id() == kShellWindowId_ModalContainer ||
|
| - window->id() == kShellWindowId_LockModalContainer;
|
| -}
|
| -
|
| -// Returns true if |window| can be activated or deactivated.
|
| -// A window manager typically defines some notion of "top level window" that
|
| -// supports activation/deactivation.
|
| -bool CanActivateWindow(aura::Window* window) {
|
| - return window &&
|
| - window->IsVisible() &&
|
| - (!aura::ActivationDelegate::GetActivationDelegate(window) ||
|
| - aura::ActivationDelegate::GetActivationDelegate(window)->
|
| - ShouldActivate(NULL)) &&
|
| - SupportsChildActivation(window->parent());
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// ActivationController, public:
|
| -
|
| -ActivationController::ActivationController()
|
| - : updating_activation_(false),
|
| - default_container_for_test_(NULL) {
|
| - aura::ActivationClient::SetActivationClient(this);
|
| - aura::RootWindow::GetInstance()->AddRootWindowObserver(this);
|
| -}
|
| -
|
| -ActivationController::~ActivationController() {
|
| - aura::RootWindow::GetInstance()->RemoveRootWindowObserver(this);
|
| -}
|
| -
|
| -// static
|
| -aura::Window* ActivationController::GetActivatableWindow(aura::Window* window) {
|
| - aura::Window* parent = window->parent();
|
| - aura::Window* child = window;
|
| - while (parent) {
|
| - if (SupportsChildActivation(parent))
|
| - return child;
|
| - // If |child| isn't activatable, but has transient parent, trace
|
| - // that path instead.
|
| - if (child->transient_parent())
|
| - return GetActivatableWindow(child->transient_parent());
|
| - parent = parent->parent();
|
| - child = child->parent();
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// StackingController, aura::ActivationClient implementation:
|
| -
|
| -void ActivationController::ActivateWindow(aura::Window* window) {
|
| - // Prevent recursion when called from focus.
|
| - if (updating_activation_)
|
| - return;
|
| -
|
| - AutoReset<bool> in_activate_window(&updating_activation_, true);
|
| - if (!window)
|
| - return;
|
| - // Nothing may actually have changed.
|
| - aura::Window* old_active = GetActiveWindow();
|
| - if (old_active == window)
|
| - return;
|
| - // The stacking client may impose rules on what window configurations can be
|
| - // activated or deactivated.
|
| - if (!CanActivateWindow(window))
|
| - return;
|
| -
|
| - if (!window->Contains(window->GetFocusManager()->GetFocusedWindow()))
|
| - window->GetFocusManager()->SetFocusedWindow(window);
|
| - aura::RootWindow::GetInstance()->SetProperty(aura::kRootWindowActiveWindow,
|
| - window);
|
| - // Invoke OnLostActive after we've changed the active window. That way if the
|
| - // delegate queries for active state it doesn't think the window is still
|
| - // active.
|
| - if (old_active && aura::ActivationDelegate::GetActivationDelegate(old_active))
|
| - aura::ActivationDelegate::GetActivationDelegate(old_active)->OnLostActive();
|
| - if (window) {
|
| - window->parent()->StackChildAtTop(window);
|
| - if (aura::ActivationDelegate::GetActivationDelegate(window))
|
| - aura::ActivationDelegate::GetActivationDelegate(window)->OnActivated();
|
| - }
|
| -}
|
| -
|
| -void ActivationController::DeactivateWindow(aura::Window* window) {
|
| - if (window)
|
| - ActivateNextWindow(window);
|
| -}
|
| -
|
| -aura::Window* ActivationController::GetActiveWindow() {
|
| - return reinterpret_cast<aura::Window*>(
|
| - aura::RootWindow::GetInstance()->GetProperty(
|
| - aura::kRootWindowActiveWindow));
|
| -}
|
| -
|
| -bool ActivationController::CanFocusWindow(aura::Window* window) const {
|
| - return CanActivateWindow(GetActivatableWindow(window));
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// ActivationController, aura::WindowObserver implementation:
|
| -
|
| -void ActivationController::OnWindowVisibilityChanged(aura::Window* window,
|
| - bool visible) {
|
| - if (!visible)
|
| - ActivateNextWindow(window);
|
| -}
|
| -
|
| -void ActivationController::OnWindowDestroyed(aura::Window* window) {
|
| - if (IsActiveWindow(window)) {
|
| - // Clear the property before activating something else, since
|
| - // ActivateWindow() will attempt to notify the window stored in this value
|
| - // otherwise.
|
| - aura::RootWindow::GetInstance()->SetProperty(aura::kRootWindowActiveWindow,
|
| - NULL);
|
| - ActivateWindow(GetTopmostWindowToActivate(window));
|
| - }
|
| - window->RemoveObserver(this);
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// ActivationController, aura::RootWindowObserver implementation:
|
| -
|
| -void ActivationController::OnWindowInitialized(aura::Window* window) {
|
| - window->AddObserver(this);
|
| -}
|
| -
|
| -void ActivationController::OnWindowFocused(aura::Window* window) {
|
| - ActivateWindow(GetActivatableWindow(window));
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// ActivationController, private:
|
| -
|
| -void ActivationController::ActivateNextWindow(aura::Window* window) {
|
| - if (IsActiveWindow(window))
|
| - ActivateWindow(GetTopmostWindowToActivate(window));
|
| -}
|
| -
|
| -aura::Window* ActivationController::GetTopmostWindowToActivate(
|
| - aura::Window* ignore) const {
|
| - const aura::Window* container =
|
| - default_container_for_test_ ? default_container_for_test_ :
|
| - GetContainer(kShellWindowId_DefaultContainer);
|
| - for (aura::Window::Windows::const_reverse_iterator i =
|
| - container->children().rbegin();
|
| - i != container->children().rend();
|
| - ++i) {
|
| - if (*i != ignore && CanActivateWindow(*i))
|
| - return *i;
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -} // namespace internal
|
| -} // namespace aura_shell
|
|
|