1 // Copyright 2013 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.
5 #include "ui/aura/client/default_activation_client.h"
7 #include "ui/aura/window.h"
8 #include "ui/wm/public/activation_change_observer.h"
9 #include "ui/wm/public/activation_delegate.h"
14 ////////////////////////////////////////////////////////////////////////////////
15 // DefaultActivationClient, public:
17 DefaultActivationClient::DefaultActivationClient(Window* root_window)
18 : last_active_(NULL) {
19 client::SetActivationClient(root_window, this);
22 DefaultActivationClient::~DefaultActivationClient() {
23 for (unsigned int i = 0; i < active_windows_.size(); ++i) {
24 active_windows_[i]->RemoveObserver(this);
28 ////////////////////////////////////////////////////////////////////////////////
29 // DefaultActivationClient, client::ActivationClient implementation:
31 void DefaultActivationClient::AddObserver(
32 client::ActivationChangeObserver* observer) {
33 observers_.AddObserver(observer);
36 void DefaultActivationClient::RemoveObserver(
37 client::ActivationChangeObserver* observer) {
38 observers_.RemoveObserver(observer);
41 void DefaultActivationClient::ActivateWindow(Window* window) {
42 Window* last_active = GetActiveWindow();
43 if (last_active == window)
46 last_active_ = last_active;
47 RemoveActiveWindow(window);
48 active_windows_.push_back(window);
49 window->parent()->StackChildAtTop(window);
50 window->AddObserver(this);
52 FOR_EACH_OBSERVER(client::ActivationChangeObserver,
54 OnWindowActivated(window, last_active));
56 aura::client::ActivationChangeObserver* observer =
57 aura::client::GetActivationChangeObserver(last_active);
59 observer->OnWindowActivated(window, last_active);
60 observer = aura::client::GetActivationChangeObserver(window);
62 observer->OnWindowActivated(window, last_active);
65 void DefaultActivationClient::DeactivateWindow(Window* window) {
66 aura::client::ActivationChangeObserver* observer =
67 aura::client::GetActivationChangeObserver(window);
69 observer->OnWindowActivated(NULL, window);
71 ActivateWindow(last_active_);
74 Window* DefaultActivationClient::GetActiveWindow() {
75 if (active_windows_.empty())
77 return active_windows_.back();
80 Window* DefaultActivationClient::GetActivatableWindow(Window* window) {
84 Window* DefaultActivationClient::GetToplevelWindow(Window* window) {
88 bool DefaultActivationClient::OnWillFocusWindow(Window* window,
89 const ui::Event* event) {
93 bool DefaultActivationClient::CanActivateWindow(Window* window) const {
97 ////////////////////////////////////////////////////////////////////////////////
98 // DefaultActivationClient, WindowObserver implementation:
100 void DefaultActivationClient::OnWindowDestroyed(Window* window) {
101 if (window == last_active_)
104 if (window == GetActiveWindow()) {
105 active_windows_.pop_back();
106 Window* next_active = GetActiveWindow();
107 if (next_active && aura::client::GetActivationChangeObserver(next_active)) {
108 aura::client::GetActivationChangeObserver(next_active)->OnWindowActivated(
114 RemoveActiveWindow(window);
117 void DefaultActivationClient::RemoveActiveWindow(Window* window) {
118 for (unsigned int i = 0; i < active_windows_.size(); ++i) {
119 if (active_windows_[i] == window) {
120 active_windows_.erase(active_windows_.begin() + i);
121 window->RemoveObserver(this);
127 } // namespace client