Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/focus_controller.h" | 5 #include "ui/wm/core/focus_controller.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "ui/aura/client/aura_constants.h" | 8 #include "ui/aura/client/aura_constants.h" |
| 9 #include "ui/aura/client/capture_client.h" | 9 #include "ui/aura/client/capture_client.h" |
| 10 #include "ui/aura/client/focus_change_observer.h" | 10 #include "ui/aura/client/focus_change_observer.h" |
| 11 #include "ui/aura/env.h" | 11 #include "ui/aura/env.h" |
| 12 #include "ui/aura/window_tracker.h" | 12 #include "ui/aura/window_tracker.h" |
| 13 #include "ui/base/ime/text_input_focus_manager.h" | |
| 13 #include "ui/events/event.h" | 14 #include "ui/events/event.h" |
| 14 #include "ui/wm/core/focus_rules.h" | 15 #include "ui/wm/core/focus_rules.h" |
| 15 #include "ui/wm/core/window_util.h" | 16 #include "ui/wm/core/window_util.h" |
| 16 #include "ui/wm/public/activation_change_observer.h" | 17 #include "ui/wm/public/activation_change_observer.h" |
| 17 | 18 |
| 18 namespace wm { | 19 namespace wm { |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 // When a modal window is activated, we bring its entire transient parent chain | 22 // When a modal window is activated, we bring its entire transient parent chain |
| 22 // to the front. This function must be called before the modal transient is | 23 // to the front. This function must be called before the modal transient is |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 126 aura::Window* activatable = | 127 aura::Window* activatable = |
| 127 focusable ? rules_->GetActivatableWindow(focusable) : NULL; | 128 focusable ? rules_->GetActivatableWindow(focusable) : NULL; |
| 128 | 129 |
| 129 // We need valid focusable/activatable windows in the event we're not clearing | 130 // We need valid focusable/activatable windows in the event we're not clearing |
| 130 // focus. "Clearing focus" is inferred by whether or not |window| passed to | 131 // focus. "Clearing focus" is inferred by whether or not |window| passed to |
| 131 // this function is non-NULL. | 132 // this function is non-NULL. |
| 132 if (window && (!focusable || !activatable)) | 133 if (window && (!focusable || !activatable)) |
| 133 return; | 134 return; |
| 134 DCHECK((focusable && activatable) || !window); | 135 DCHECK((focusable && activatable) || !window); |
| 135 | 136 |
| 137 // |window| is going to get the focus, so reset the text input client. | |
| 138 // SetActiveWindow() and/or SetFocusedWindow() may set a proper text input | |
| 139 // client if the implementation supports text input. | |
| 140 ui::TextInputFocusManager* text_input_focus_manager = | |
| 141 ui::TextInputFocusManager::GetInstance(); | |
| 142 if (window) | |
| 143 text_input_focus_manager->FocusTextInputClient(NULL); | |
|
sky
2014/04/25 18:20:21
Shouldn't all this be in SetFocusedWindow?
Yuki
2014/04/28 12:59:29
You're right. Moved.
| |
| 144 | |
| 136 // Activation change observers may change the focused window. If this happens | 145 // Activation change observers may change the focused window. If this happens |
| 137 // we must not adjust the focus below since this will clobber that change. | 146 // we must not adjust the focus below since this will clobber that change. |
| 138 aura::Window* last_focused_window = focused_window_; | 147 aura::Window* last_focused_window = focused_window_; |
| 139 if (!updating_activation_) | 148 if (!updating_activation_) |
| 140 SetActiveWindow(window, activatable); | 149 SetActiveWindow(window, activatable); |
| 141 | 150 |
| 142 // If the window's ActivationChangeObserver shifted focus to a valid window, | 151 // If the window's ActivationChangeObserver shifted focus to a valid window, |
| 143 // we don't want to focus the window we thought would be focused by default. | 152 // we don't want to focus the window we thought would be focused by default. |
| 144 bool activation_changed_focus = last_focused_window != focused_window_; | 153 bool activation_changed_focus = last_focused_window != focused_window_; |
| 145 if (!updating_focus_ && (!activation_changed_focus || !focused_window_)) { | 154 if (!updating_focus_ && (!activation_changed_focus || !focused_window_)) { |
| 146 if (active_window_ && focusable) | 155 if (active_window_ && focusable) |
| 147 DCHECK(active_window_->Contains(focusable)); | 156 DCHECK(active_window_->Contains(focusable)); |
| 148 SetFocusedWindow(focusable); | 157 SetFocusedWindow(focusable); |
| 149 } | 158 } |
| 159 | |
| 160 // Ensure that the text input client is reset when the window loses the focus. | |
| 161 if (!window) | |
| 162 text_input_focus_manager->FocusTextInputClient(NULL); | |
| 150 } | 163 } |
| 151 | 164 |
| 152 void FocusController::ResetFocusWithinActiveWindow(aura::Window* window) { | 165 void FocusController::ResetFocusWithinActiveWindow(aura::Window* window) { |
| 153 DCHECK(window); | 166 DCHECK(window); |
| 154 if (!active_window_) | 167 if (!active_window_) |
| 155 return; | 168 return; |
| 156 if (!active_window_->Contains(window)) | 169 if (!active_window_->Contains(window)) |
| 157 return; | 170 return; |
| 158 SetFocusedWindow(window); | 171 SetFocusedWindow(window); |
| 159 } | 172 } |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 344 | 357 |
| 345 void FocusController::WindowFocusedFromInputEvent(aura::Window* window) { | 358 void FocusController::WindowFocusedFromInputEvent(aura::Window* window) { |
| 346 // Only focus |window| if it or any of its parents can be focused. Otherwise | 359 // Only focus |window| if it or any of its parents can be focused. Otherwise |
| 347 // FocusWindow() will focus the topmost window, which may not be the | 360 // FocusWindow() will focus the topmost window, which may not be the |
| 348 // currently focused one. | 361 // currently focused one. |
| 349 if (rules_->CanFocusWindow(GetToplevelWindow(window))) | 362 if (rules_->CanFocusWindow(GetToplevelWindow(window))) |
| 350 FocusWindow(window); | 363 FocusWindow(window); |
| 351 } | 364 } |
| 352 | 365 |
| 353 } // namespace wm | 366 } // namespace wm |
| OLD | NEW |