Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(780)

Side by Side Diff: ui/wm/core/default_activation_client.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/wm/core/default_activation_client.h ('k') | ui/wm/core/easy_resize_window_targeter.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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.
4
5 #include "ui/wm/core/default_activation_client.h"
6
7 #include "ui/aura/window.h"
8 #include "ui/wm/public/activation_change_observer.h"
9 #include "ui/wm/public/activation_delegate.h"
10
11 namespace wm {
12
13 // Takes care of observing root window destruction & destroying the client.
14 class DefaultActivationClient::Deleter : public aura::WindowObserver {
15 public:
16 Deleter(DefaultActivationClient* client, aura::Window* root_window)
17 : client_(client),
18 root_window_(root_window) {
19 root_window_->AddObserver(this);
20 }
21
22 private:
23 virtual ~Deleter() {}
24
25 // Overridden from WindowObserver:
26 virtual void OnWindowDestroyed(aura::Window* window) override {
27 DCHECK_EQ(window, root_window_);
28 root_window_->RemoveObserver(this);
29 delete client_;
30 delete this;
31 }
32
33 DefaultActivationClient* client_;
34 aura::Window* root_window_;
35
36 DISALLOW_COPY_AND_ASSIGN(Deleter);
37 };
38
39 ////////////////////////////////////////////////////////////////////////////////
40 // DefaultActivationClient, public:
41
42 DefaultActivationClient::DefaultActivationClient(aura::Window* root_window)
43 : last_active_(NULL) {
44 aura::client::SetActivationClient(root_window, this);
45 new Deleter(this, root_window);
46 }
47
48 ////////////////////////////////////////////////////////////////////////////////
49 // DefaultActivationClient, client::ActivationClient implementation:
50
51 void DefaultActivationClient::AddObserver(
52 aura::client::ActivationChangeObserver* observer) {
53 observers_.AddObserver(observer);
54 }
55
56 void DefaultActivationClient::RemoveObserver(
57 aura::client::ActivationChangeObserver* observer) {
58 observers_.RemoveObserver(observer);
59 }
60
61 void DefaultActivationClient::ActivateWindow(aura::Window* window) {
62 aura::Window* last_active = GetActiveWindow();
63 if (last_active == window)
64 return;
65
66 last_active_ = last_active;
67 RemoveActiveWindow(window);
68 active_windows_.push_back(window);
69 window->parent()->StackChildAtTop(window);
70 window->AddObserver(this);
71
72 FOR_EACH_OBSERVER(aura::client::ActivationChangeObserver,
73 observers_,
74 OnWindowActivated(window, last_active));
75
76 aura::client::ActivationChangeObserver* observer =
77 aura::client::GetActivationChangeObserver(last_active);
78 if (observer)
79 observer->OnWindowActivated(window, last_active);
80 observer = aura::client::GetActivationChangeObserver(window);
81 if (observer)
82 observer->OnWindowActivated(window, last_active);
83 }
84
85 void DefaultActivationClient::DeactivateWindow(aura::Window* window) {
86 aura::client::ActivationChangeObserver* observer =
87 aura::client::GetActivationChangeObserver(window);
88 if (observer)
89 observer->OnWindowActivated(NULL, window);
90 if (last_active_)
91 ActivateWindow(last_active_);
92 }
93
94 aura::Window* DefaultActivationClient::GetActiveWindow() {
95 if (active_windows_.empty())
96 return NULL;
97 return active_windows_.back();
98 }
99
100 aura::Window* DefaultActivationClient::GetActivatableWindow(
101 aura::Window* window) {
102 return NULL;
103 }
104
105 aura::Window* DefaultActivationClient::GetToplevelWindow(aura::Window* window) {
106 return NULL;
107 }
108
109 bool DefaultActivationClient::CanActivateWindow(aura::Window* window) const {
110 return true;
111 }
112
113 ////////////////////////////////////////////////////////////////////////////////
114 // DefaultActivationClient, aura::WindowObserver implementation:
115
116 void DefaultActivationClient::OnWindowDestroyed(aura::Window* window) {
117 if (window == last_active_)
118 last_active_ = NULL;
119
120 if (window == GetActiveWindow()) {
121 active_windows_.pop_back();
122 aura::Window* next_active = GetActiveWindow();
123 if (next_active && aura::client::GetActivationChangeObserver(next_active)) {
124 aura::client::GetActivationChangeObserver(next_active)->OnWindowActivated(
125 next_active, NULL);
126 }
127 return;
128 }
129
130 RemoveActiveWindow(window);
131 }
132
133 ////////////////////////////////////////////////////////////////////////////////
134 // DefaultActivationClient, private:
135
136 DefaultActivationClient::~DefaultActivationClient() {
137 for (unsigned int i = 0; i < active_windows_.size(); ++i) {
138 active_windows_[i]->RemoveObserver(this);
139 }
140 }
141
142 void DefaultActivationClient::RemoveActiveWindow(aura::Window* window) {
143 for (unsigned int i = 0; i < active_windows_.size(); ++i) {
144 if (active_windows_[i] == window) {
145 active_windows_.erase(active_windows_.begin() + i);
146 window->RemoveObserver(this);
147 return;
148 }
149 }
150 }
151
152 } // namespace wm
OLDNEW
« no previous file with comments | « ui/wm/core/default_activation_client.h ('k') | ui/wm/core/easy_resize_window_targeter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698