Chromium Code Reviews| Index: ash/wm/window_selector_controller.cc |
| diff --git a/ash/wm/window_selector_controller.cc b/ash/wm/window_selector_controller.cc |
| index c7fe6966383f3988dc7876fc68e86bb8fe7649c6..198e2bb9c325912c2b5c93c1d56f4f8975ee4d73 100644 |
| --- a/ash/wm/window_selector_controller.cc |
| +++ b/ash/wm/window_selector_controller.cc |
| @@ -9,9 +9,46 @@ |
| #include "ash/wm/mru_window_tracker.h" |
| #include "ash/wm/window_selector.h" |
| #include "ash/wm/window_util.h" |
| +#include "ui/base/events/event.h" |
| +#include "ui/base/events/event_handler.h" |
| namespace ash { |
| +namespace { |
| + |
| +// Filter to watch for the termination of a keyboard gesture to cycle through |
| +// multiple windows. |
| +class WindowSelectorEventFilter : public ui::EventHandler { |
| + public: |
| + WindowSelectorEventFilter(); |
| + virtual ~WindowSelectorEventFilter(); |
| + |
| + // Overridden from ui::EventHandler: |
| + virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; |
|
Daniel Erat
2013/08/09 20:54:35
nit: add a blank line after this one
flackr
2013/08/09 22:15:36
Done.
|
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(WindowSelectorEventFilter); |
| +}; |
| + |
| +// Watch for all keyboard events by filtering the root window. |
| +WindowSelectorEventFilter::WindowSelectorEventFilter() { |
| + Shell::GetInstance()->AddPreTargetHandler(this); |
| +} |
| + |
| +WindowSelectorEventFilter::~WindowSelectorEventFilter() { |
| + Shell::GetInstance()->RemovePreTargetHandler(this); |
| +} |
| + |
| +void WindowSelectorEventFilter::OnKeyEvent(ui::KeyEvent* event) { |
| + // Views uses VKEY_MENU for both left and right Alt keys. |
| + if (event->key_code() == ui::VKEY_MENU && |
| + event->type() == ui::ET_KEY_RELEASED) { |
| + Shell::GetInstance()->window_selector_controller()->AltKeyReleased(); |
| + // Warning: |this| will be deleted from here on. |
| + } |
| +} |
| + |
| +} // namespace |
| + |
| WindowSelectorController::WindowSelectorController() { |
| } |
| @@ -41,10 +78,33 @@ void WindowSelectorController::ToggleOverview() { |
| aura::Window* active_window = wm::GetActiveWindow(); |
| if (active_window) |
| wm::DeactivateWindow(active_window); |
| - window_selector_.reset(new WindowSelector(windows, this)); |
| + window_selector_.reset( |
| + new WindowSelector(windows, WindowSelector::OVERVIEW, this)); |
| } |
| } |
| +void WindowSelectorController::HandleCycleWindow( |
| + WindowSelector::Direction direction) { |
| + if (!CanSelect()) |
| + return; |
| + |
| + if (!IsSelecting()) { |
| + event_handler_.reset(new WindowSelectorEventFilter()); |
| + std::vector<aura::Window*> windows = ash::Shell::GetInstance()-> |
| + mru_window_tracker()->BuildMruWindowList(); |
| + window_selector_.reset( |
| + new WindowSelector(windows, WindowSelector::CYCLE, this)); |
| + window_selector_->Step(direction); |
| + } else if (window_selector_->mode() == WindowSelector::CYCLE) { |
| + window_selector_->Step(direction); |
| + } |
| +} |
| + |
| +void WindowSelectorController::AltKeyReleased() { |
| + event_handler_.reset(); |
| + window_selector_->SelectWindow(); |
| +} |
| + |
| bool WindowSelectorController::IsSelecting() { |
| return window_selector_.get() != NULL; |
| } |