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..e6cd3837a64e5b0241c899ce1317a84d7663d3cb 100644 |
--- a/ash/wm/window_selector_controller.cc |
+++ b/ash/wm/window_selector_controller.cc |
@@ -9,9 +9,47 @@ |
#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; |
+ |
+ 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 +79,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; |
} |