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

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

Issue 2809073002: cros: allow aura window not considered activatable for pointer event (Closed)
Patch Set: Created 3 years, 8 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/wm/core/base_focus_rules.h" 5 #include "ui/wm/core/base_focus_rules.h"
6 6
7 #include "ui/aura/client/focus_client.h" 7 #include "ui/aura/client/focus_client.h"
8 #include "ui/aura/window.h" 8 #include "ui/aura/window.h"
9 #include "ui/wm/core/window_modality_controller.h" 9 #include "ui/wm/core/window_modality_controller.h"
10 #include "ui/wm/core/window_util.h" 10 #include "ui/wm/core/window_util.h"
11 #include "ui/wm/public/activation_delegate.h" 11 #include "ui/wm/public/activation_delegate.h"
12 12
13 namespace wm { 13 namespace wm {
14 namespace { 14 namespace {
15 15
16 aura::Window* GetFocusedWindow(aura::Window* context) { 16 aura::Window* GetFocusedWindow(aura::Window* context) {
17 aura::client::FocusClient* focus_client = 17 aura::client::FocusClient* focus_client =
18 aura::client::GetFocusClient(context); 18 aura::client::GetFocusClient(context);
19 return focus_client ? focus_client->GetFocusedWindow() : NULL; 19 return focus_client ? focus_client->GetFocusedWindow() : nullptr;
20 } 20 }
21 21
22 } // namespace 22 } // namespace
23 23
24 //////////////////////////////////////////////////////////////////////////////// 24 ////////////////////////////////////////////////////////////////////////////////
25 // BaseFocusRules, protected: 25 // BaseFocusRules, protected:
26 26
27 BaseFocusRules::BaseFocusRules() { 27 BaseFocusRules::BaseFocusRules() = default;
28 }
29 28
30 BaseFocusRules::~BaseFocusRules() { 29 BaseFocusRules::~BaseFocusRules() = default;
31 }
32 30
33 bool BaseFocusRules::IsWindowConsideredVisibleForActivation( 31 bool BaseFocusRules::IsWindowConsideredVisibleForActivation(
34 aura::Window* window) const { 32 aura::Window* window) const {
35 return window->IsVisible(); 33 return window->IsVisible();
36 } 34 }
37 35
38 //////////////////////////////////////////////////////////////////////////////// 36 ////////////////////////////////////////////////////////////////////////////////
39 // BaseFocusRules, FocusRules implementation: 37 // BaseFocusRules, FocusRules implementation:
40 38
41 bool BaseFocusRules::IsToplevelWindow(aura::Window* window) const { 39 bool BaseFocusRules::IsToplevelWindow(aura::Window* window) const {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 return true; 82 return true;
85 83
86 // The focused window is always inside the active window, so windows that 84 // The focused window is always inside the active window, so windows that
87 // aren't activatable can't contain the focused window. 85 // aren't activatable can't contain the focused window.
88 aura::Window* activatable = GetActivatableWindow(window); 86 aura::Window* activatable = GetActivatableWindow(window);
89 if (!activatable || !activatable->Contains(window)) 87 if (!activatable || !activatable->Contains(window))
90 return false; 88 return false;
91 return window->CanFocus(); 89 return window->CanFocus();
92 } 90 }
93 91
92 bool BaseFocusRules::IsWindowConsideredActivatableForEvent(
93 aura::Window* window,
94 ui::Event* event) const {
95 return true;
96 }
97
94 aura::Window* BaseFocusRules::GetToplevelWindow(aura::Window* window) const { 98 aura::Window* BaseFocusRules::GetToplevelWindow(aura::Window* window) const {
95 aura::Window* parent = window->parent(); 99 aura::Window* parent = window->parent();
96 aura::Window* child = window; 100 aura::Window* child = window;
97 while (parent) { 101 while (parent) {
98 if (IsToplevelWindow(child)) 102 if (IsToplevelWindow(child))
99 return child; 103 return child;
100 104
101 parent = parent->parent(); 105 parent = parent->parent();
102 child = child->parent(); 106 child = child->parent();
103 } 107 }
104 return NULL; 108 return nullptr;
105 } 109 }
106 110
107 aura::Window* BaseFocusRules::GetActivatableWindow(aura::Window* window) const { 111 aura::Window* BaseFocusRules::GetActivatableWindow(aura::Window* window) const {
108 aura::Window* parent = window->parent(); 112 aura::Window* parent = window->parent();
109 aura::Window* child = window; 113 aura::Window* child = window;
110 while (parent) { 114 while (parent) {
111 if (CanActivateWindow(child)) 115 if (CanActivateWindow(child))
112 return child; 116 return child;
113 117
114 // CanActivateWindow() above will return false if |child| is blocked by a 118 // CanActivateWindow() above will return false if |child| is blocked by a
(...skipping 11 matching lines...) Expand all
126 GetModalTransient(wm::GetTransientParent(child)); 130 GetModalTransient(wm::GetTransientParent(child));
127 if (parent_modal_transient == child) 131 if (parent_modal_transient == child)
128 return child; 132 return child;
129 133
130 return GetActivatableWindow(wm::GetTransientParent(child)); 134 return GetActivatableWindow(wm::GetTransientParent(child));
131 } 135 }
132 136
133 parent = parent->parent(); 137 parent = parent->parent();
134 child = child->parent(); 138 child = child->parent();
135 } 139 }
136 return NULL; 140 return nullptr;
137 } 141 }
138 142
139 aura::Window* BaseFocusRules::GetFocusableWindow(aura::Window* window) const { 143 aura::Window* BaseFocusRules::GetFocusableWindow(aura::Window* window) const {
140 if (CanFocusWindow(window)) 144 if (CanFocusWindow(window))
141 return window; 145 return window;
142 146
143 // |window| may be in a hierarchy that is non-activatable, in which case we 147 // |window| may be in a hierarchy that is non-activatable, in which case we
144 // need to cut over to the activatable hierarchy. 148 // need to cut over to the activatable hierarchy.
145 aura::Window* activatable = GetActivatableWindow(window); 149 aura::Window* activatable = GetActivatableWindow(window);
146 if (!activatable) { 150 if (!activatable) {
147 // There may not be a related activatable hierarchy to cut over to, in which 151 // There may not be a related activatable hierarchy to cut over to, in which
148 // case we try an unrelated one. 152 // case we try an unrelated one.
149 aura::Window* toplevel = GetToplevelWindow(window); 153 aura::Window* toplevel = GetToplevelWindow(window);
150 if (toplevel) 154 if (toplevel)
151 activatable = GetNextActivatableWindow(toplevel); 155 activatable = GetNextActivatableWindow(toplevel);
152 if (!activatable) 156 if (!activatable)
153 return NULL; 157 return nullptr;
154 } 158 }
155 159
156 if (!activatable->Contains(window)) { 160 if (!activatable->Contains(window)) {
157 // If there's already a child window focused in the activatable hierarchy, 161 // If there's already a child window focused in the activatable hierarchy,
158 // just use that (i.e. don't shift focus), otherwise we need to at least cut 162 // just use that (i.e. don't shift focus), otherwise we need to at least cut
159 // over to the activatable hierarchy. 163 // over to the activatable hierarchy.
160 aura::Window* focused = GetFocusedWindow(activatable); 164 aura::Window* focused = GetFocusedWindow(activatable);
161 return activatable->Contains(focused) ? focused : activatable; 165 return activatable->Contains(focused) ? focused : activatable;
162 } 166 }
163 167
164 while (window && !CanFocusWindow(window)) 168 while (window && !CanFocusWindow(window))
165 window = window->parent(); 169 window = window->parent();
166 return window; 170 return window;
167 } 171 }
168 172
169 aura::Window* BaseFocusRules::GetNextActivatableWindow( 173 aura::Window* BaseFocusRules::GetNextActivatableWindow(
170 aura::Window* ignore) const { 174 aura::Window* ignore) const {
171 DCHECK(ignore); 175 DCHECK(ignore);
172 176
173 // Can be called from the RootWindow's destruction, which has a NULL parent. 177 // Can be called from the RootWindow's destruction, which has a NULL parent.
174 if (!ignore->parent()) 178 if (!ignore->parent())
175 return NULL; 179 return nullptr;
176 180
177 // In the basic scenarios handled by BasicFocusRules, the pool of activatable 181 // In the basic scenarios handled by BasicFocusRules, the pool of activatable
178 // windows is limited to the |ignore|'s siblings. 182 // windows is limited to the |ignore|'s siblings.
179 const aura::Window::Windows& siblings = ignore->parent()->children(); 183 const aura::Window::Windows& siblings = ignore->parent()->children();
180 DCHECK(!siblings.empty()); 184 DCHECK(!siblings.empty());
181 185
182 for (aura::Window::Windows::const_reverse_iterator rit = siblings.rbegin(); 186 for (aura::Window::Windows::const_reverse_iterator rit = siblings.rbegin();
183 rit != siblings.rend(); 187 rit != siblings.rend();
184 ++rit) { 188 ++rit) {
185 aura::Window* cur = *rit; 189 aura::Window* cur = *rit;
186 if (cur == ignore) 190 if (cur == ignore)
187 continue; 191 continue;
188 if (CanActivateWindow(cur)) 192 if (CanActivateWindow(cur))
189 return cur; 193 return cur;
190 } 194 }
191 return NULL; 195 return nullptr;
192 } 196 }
193 197
194 } // namespace wm 198 } // namespace wm
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698