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

Unified Diff: ash/wm/window_selector_controller.cc

Issue 22715005: Use overview mode for alt-tab cycling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 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 side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698