summaryrefslogtreecommitdiff
path: root/chromium/ash/wm/window_cycle_controller.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/wm/window_cycle_controller.h')
-rw-r--r--chromium/ash/wm/window_cycle_controller.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/chromium/ash/wm/window_cycle_controller.h b/chromium/ash/wm/window_cycle_controller.h
new file mode 100644
index 00000000000..12822c0e0fa
--- /dev/null
+++ b/chromium/ash/wm/window_cycle_controller.h
@@ -0,0 +1,82 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_WM_WINDOW_CYCLE_CONTROLLER_H_
+#define ASH_WM_WINDOW_CYCLE_CONTROLLER_H_
+
+#include "ash/ash_export.h"
+#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
+
+namespace ui {
+class EventHandler;
+}
+
+namespace ash {
+
+class WindowCycleList;
+
+// Controls cycling through windows with the keyboard, for example, via alt-tab.
+// Windows are sorted primarily by most recently used, and then by screen order.
+// We activate windows as you cycle through them, so the order on the screen
+// may change during the gesture, but the most recently used list isn't updated
+// until the cycling ends. Thus we maintain the state of the windows
+// at the beginning of the gesture so you can cycle through in a consistent
+// order.
+class ASH_EXPORT WindowCycleController {
+ public:
+ enum Direction {
+ FORWARD,
+ BACKWARD
+ };
+ WindowCycleController();
+ virtual ~WindowCycleController();
+
+ // Returns true if cycling through windows is enabled. This is false at
+ // certain times, such as when the lock screen is visible.
+ static bool CanCycle();
+
+ // Cycles between windows in the given |direction|. If |is_alt_down| then
+ // interprets this call as the start of a multi-step cycle sequence and
+ // installs a key filter to watch for alt being released.
+ void HandleCycleWindow(Direction direction, bool is_alt_down);
+
+ // Cycles between windows without maintaining a multi-step cycle sequence
+ // (see above).
+ void HandleLinearCycleWindow();
+
+ // Informs the controller that the Alt key has been released and it can
+ // terminate the existing multi-step cycle.
+ void AltKeyReleased();
+
+ // Returns true if we are in the middle of a window cycling gesture.
+ bool IsCycling() const { return windows_.get() != NULL; }
+
+ // Returns the WindowCycleList. Really only useful for testing.
+ const WindowCycleList* windows() const { return windows_.get(); }
+
+ private:
+ // Call to start cycling windows. You must call StopCycling() when done.
+ void StartCycling();
+
+ // Cycles to the next or previous window based on |direction|.
+ void Step(Direction direction);
+
+ // Installs an event filter to watch for release of the alt key.
+ void InstallEventFilter();
+
+ // Stops the current window cycle and cleans up the event filter.
+ void StopCycling();
+
+ scoped_ptr<WindowCycleList> windows_;
+
+ // Event handler to watch for release of alt key.
+ scoped_ptr<ui::EventHandler> event_handler_;
+
+ DISALLOW_COPY_AND_ASSIGN(WindowCycleController);
+};
+
+} // namespace ash
+
+#endif // ASH_WM_WINDOW_CYCLE_CONTROLLER_H_