| 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/views/corewm/focus_controller.h" | 5 #include "ui/views/corewm/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/env.h" | 9 #include "ui/aura/env.h" |
| 10 #include "ui/views/corewm/focus_change_event.h" | 10 #include "ui/views/corewm/focus_change_event.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 ui::EventTarget** event_dispatch_target) { | 38 ui::EventTarget** event_dispatch_target) { |
| 39 int result = ui::ER_UNHANDLED; | 39 int result = ui::ER_UNHANDLED; |
| 40 { | 40 { |
| 41 base::AutoReset<ui::EventTarget*> reset(event_dispatch_target, *state); | 41 base::AutoReset<ui::EventTarget*> reset(event_dispatch_target, *state); |
| 42 FocusChangeEvent changing_event(changing_event_type); | 42 FocusChangeEvent changing_event(changing_event_type); |
| 43 result = dispatcher->ProcessEvent(*state, &changing_event); | 43 result = dispatcher->ProcessEvent(*state, &changing_event); |
| 44 } | 44 } |
| 45 DCHECK(!(result & ui::ER_CONSUMED)) | 45 DCHECK(!(result & ui::ER_CONSUMED)) |
| 46 << "Focus and Activation events cannot be consumed"; | 46 << "Focus and Activation events cannot be consumed"; |
| 47 | 47 |
| 48 aura::Window* lost_active = *state; |
| 48 *state = new_state; | 49 *state = new_state; |
| 49 | 50 |
| 50 if (restack && new_state) { | 51 if (restack && new_state) { |
| 51 StackTransientParentsBelowModalWindow(new_state); | 52 StackTransientParentsBelowModalWindow(new_state); |
| 52 new_state->parent()->StackChildAtTop(new_state); | 53 new_state->parent()->StackChildAtTop(new_state); |
| 53 } | 54 } |
| 54 | 55 |
| 55 { | 56 { |
| 56 base::AutoReset<ui::EventTarget*> reset(event_dispatch_target, *state); | 57 base::AutoReset<ui::EventTarget*> reset(event_dispatch_target, *state); |
| 57 FocusChangeEvent changed_event(changed_event_type); | 58 FocusChangeEvent changed_event(changed_event_type); |
| 59 FocusChangeEvent::DispatcherApi(&changed_event).set_last_focus(lost_active); |
| 58 dispatcher->ProcessEvent(*state, &changed_event); | 60 dispatcher->ProcessEvent(*state, &changed_event); |
| 59 } | 61 } |
| 60 } | 62 } |
| 61 | 63 |
| 62 } // namespace | 64 } // namespace |
| 63 | 65 |
| 64 //////////////////////////////////////////////////////////////////////////////// | 66 //////////////////////////////////////////////////////////////////////////////// |
| 65 // FocusController, public: | 67 // FocusController, public: |
| 66 | 68 |
| 67 FocusController::FocusController(FocusRules* rules) | 69 FocusController::FocusController(FocusRules* rules) |
| 68 : active_window_(NULL), | 70 : active_window_(NULL), |
| 69 focused_window_(NULL), | 71 focused_window_(NULL), |
| 70 event_dispatch_target_(NULL), | 72 event_dispatch_target_(NULL), |
| 71 rules_(rules) { | 73 rules_(rules) { |
| 72 DCHECK(rules); | 74 DCHECK(rules); |
| 73 FocusChangeEvent::RegisterEventTypes(); | 75 FocusChangeEvent::RegisterEventTypes(); |
| 74 aura::Env::GetInstance()->AddObserver(this); | 76 aura::Env::GetInstance()->AddObserver(this); |
| 75 } | 77 } |
| 76 | 78 |
| 77 FocusController::~FocusController() { | 79 FocusController::~FocusController() { |
| 78 aura::Env::GetInstance()->RemoveObserver(this); | 80 aura::Env::GetInstance()->RemoveObserver(this); |
| 79 } | 81 } |
| 80 | 82 |
| 81 void FocusController::FocusWindow(aura::Window* window) { | |
| 82 // Focusing a window also activates its containing activatable window. Note | |
| 83 // that the rules could redirect activation activation and/or focus. | |
| 84 aura::Window* focusable = rules_->GetFocusableWindow(window); | |
| 85 SetActiveWindow(rules_->GetActivatableWindow(focusable)); | |
| 86 DCHECK(GetActiveWindow()->Contains(focusable)); | |
| 87 SetFocusedWindow(focusable); | |
| 88 } | |
| 89 | |
| 90 //////////////////////////////////////////////////////////////////////////////// | 83 //////////////////////////////////////////////////////////////////////////////// |
| 91 // FocusController, aura::client::ActivationClient implementation: | 84 // FocusController, aura::client::ActivationClient implementation: |
| 92 | 85 |
| 93 void FocusController::AddObserver( | 86 void FocusController::AddObserver( |
| 94 aura::client::ActivationChangeObserver* observer) { | 87 aura::client::ActivationChangeObserver* observer) { |
| 95 NOTREACHED(); | 88 //NOTREACHED(); |
| 96 } | 89 } |
| 97 | 90 |
| 98 void FocusController::RemoveObserver( | 91 void FocusController::RemoveObserver( |
| 99 aura::client::ActivationChangeObserver* observer) { | 92 aura::client::ActivationChangeObserver* observer) { |
| 100 NOTREACHED(); | 93 //NOTREACHED(); |
| 101 } | 94 } |
| 102 | 95 |
| 103 void FocusController::ActivateWindow(aura::Window* window) { | 96 void FocusController::ActivateWindow(aura::Window* window) { |
| 104 FocusWindow(window); | 97 FocusWindow(window, NULL); |
| 105 } | 98 } |
| 106 | 99 |
| 107 void FocusController::DeactivateWindow(aura::Window* window) { | 100 void FocusController::DeactivateWindow(aura::Window* window) { |
| 108 FocusWindow(rules_->GetNextActivatableWindow(window)); | 101 FocusWindow(rules_->GetNextActivatableWindow(window), NULL); |
| 109 } | 102 } |
| 110 | 103 |
| 111 aura::Window* FocusController::GetActiveWindow() { | 104 aura::Window* FocusController::GetActiveWindow() { |
| 112 return active_window_; | 105 return active_window_; |
| 113 } | 106 } |
| 114 | 107 |
| 115 aura::Window* FocusController::GetActivatableWindow(aura::Window* window) { | 108 aura::Window* FocusController::GetActivatableWindow(aura::Window* window) { |
| 116 return rules_->GetActivatableWindow(window); | 109 return rules_->GetActivatableWindow(window); |
| 117 } | 110 } |
| 118 | 111 |
| 119 bool FocusController::OnWillFocusWindow(aura::Window* window, | 112 bool FocusController::OnWillFocusWindow(aura::Window* window, |
| 120 const ui::Event* event) { | 113 const ui::Event* event) { |
| 121 NOTREACHED(); | 114 NOTREACHED(); |
| 122 return false; | 115 return false; |
| 123 } | 116 } |
| 124 | 117 |
| 125 bool FocusController::CanActivateWindow(aura::Window* window) const { | 118 bool FocusController::CanActivateWindow(aura::Window* window) const { |
| 126 return rules_->CanActivateWindow(window); | 119 return rules_->CanActivateWindow(window); |
| 127 } | 120 } |
| 128 | 121 |
| 129 //////////////////////////////////////////////////////////////////////////////// | 122 //////////////////////////////////////////////////////////////////////////////// |
| 123 // FocusController, aura::client::FocusClient implementation: |
| 124 |
| 125 void FocusController::AddObserver( |
| 126 aura::client::FocusChangeObserver* observer) { |
| 127 //NOTREACHED(); |
| 128 } |
| 129 |
| 130 void FocusController::RemoveObserver( |
| 131 aura::client::FocusChangeObserver* observer) { |
| 132 //NOTREACHED(); |
| 133 } |
| 134 |
| 135 void FocusController::FocusWindow(aura::Window* window, |
| 136 const ui::Event* event) { |
| 137 // Focusing a window also activates its containing activatable window. Note |
| 138 // that the rules could redirect activation activation and/or focus. |
| 139 aura::Window* focusable = rules_->GetFocusableWindow(window); |
| 140 SetActiveWindow(rules_->GetActivatableWindow(focusable)); |
| 141 DCHECK(GetActiveWindow()->Contains(focusable)); |
| 142 SetFocusedWindow(focusable); |
| 143 } |
| 144 |
| 145 aura::Window* FocusController::GetFocusedWindow() { |
| 146 return focused_window_; |
| 147 } |
| 148 |
| 149 //////////////////////////////////////////////////////////////////////////////// |
| 130 // FocusController, ui::EventHandler implementation: | 150 // FocusController, ui::EventHandler implementation: |
| 131 ui::EventResult FocusController::OnKeyEvent(ui::KeyEvent* event) { | 151 ui::EventResult FocusController::OnKeyEvent(ui::KeyEvent* event) { |
| 132 return ui::ER_UNHANDLED; | 152 return ui::ER_UNHANDLED; |
| 133 } | 153 } |
| 134 | 154 |
| 135 ui::EventResult FocusController::OnMouseEvent(ui::MouseEvent* event) { | 155 ui::EventResult FocusController::OnMouseEvent(ui::MouseEvent* event) { |
| 136 if (event->type() == ui::ET_MOUSE_PRESSED) | 156 if (event->type() == ui::ET_MOUSE_PRESSED) |
| 137 WindowFocusedFromInputEvent(static_cast<aura::Window*>(event->target())); | 157 WindowFocusedFromInputEvent(static_cast<aura::Window*>(event->target())); |
| 138 return ui::ER_UNHANDLED; | 158 return ui::ER_UNHANDLED; |
| 139 } | 159 } |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 aura::Window* next_activatable = rules_->GetNextActivatableWindow(window); | 255 aura::Window* next_activatable = rules_->GetNextActivatableWindow(window); |
| 236 SetActiveWindow(next_activatable); | 256 SetActiveWindow(next_activatable); |
| 237 SetFocusedWindow(next_activatable); | 257 SetFocusedWindow(next_activatable); |
| 238 } else if (window->Contains(focused_window_)) { | 258 } else if (window->Contains(focused_window_)) { |
| 239 // Active window isn't changing, but focused window might be. | 259 // Active window isn't changing, but focused window might be. |
| 240 SetFocusedWindow(rules_->GetNextFocusableWindow(window)); | 260 SetFocusedWindow(rules_->GetNextFocusableWindow(window)); |
| 241 } | 261 } |
| 242 } | 262 } |
| 243 | 263 |
| 244 void FocusController::WindowFocusedFromInputEvent(aura::Window* window) { | 264 void FocusController::WindowFocusedFromInputEvent(aura::Window* window) { |
| 245 FocusWindow(window); | 265 FocusWindow(window, NULL); |
| 246 } | 266 } |
| 247 | 267 |
| 248 } // namespace corewm | 268 } // namespace corewm |
| 249 } // namespace views | 269 } // namespace views |
| OLD | NEW |