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

Unified Diff: ash/wm/window_cycle_controller.cc

Issue 20708005: Refactor most recently used window tracking into a separate class. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Address comments. Created 7 years, 5 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
« no previous file with comments | « ash/wm/window_cycle_controller.h ('k') | ash/wm/window_cycle_list.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/wm/window_cycle_controller.cc
diff --git a/ash/wm/window_cycle_controller.cc b/ash/wm/window_cycle_controller.cc
index 89af6c1836f8548ee56c5c4ded9f0eed40dabd9c..413d0da958d9d4e26c9cc79c7d5c026f63985a3c 100644
--- a/ash/wm/window_cycle_controller.cc
+++ b/ash/wm/window_cycle_controller.cc
@@ -9,7 +9,7 @@
#include "ash/session_state_delegate.h"
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
-#include "ash/wm/activation_controller.h"
+#include "ash/wm/mru_window_tracker.h"
#include "ash/wm/window_cycle_list.h"
#include "ash/wm/window_util.h"
#include "ash/wm/workspace_controller.h"
@@ -21,12 +21,6 @@ namespace ash {
namespace {
-// List of containers whose children we will cycle through.
-const int kContainerIds[] = {
- internal::kShellWindowId_DefaultContainer,
- internal::kShellWindowId_AlwaysOnTopContainer
-};
-
// Filter to watch for the termination of a keyboard gesture to cycle through
// multiple windows.
class WindowCycleEventFilter : public ui::EventHandler {
@@ -56,65 +50,15 @@ void WindowCycleEventFilter::OnKeyEvent(ui::KeyEvent* event) {
}
}
-// Adds all the children of |window| to |windows|.
-void AddAllChildren(aura::Window* window,
- WindowCycleList::WindowList* windows) {
- const WindowCycleList::WindowList& children(window->children());
- windows->insert(windows->end(), children.begin(), children.end());
-}
-
-// Adds all the children of all of |window|s children to |windows|.
-void AddWorkspaceChildren(aura::Window* window,
- WindowCycleList::WindowList* windows) {
- for (size_t i = 0; i < window->children().size(); ++i)
- AddAllChildren(window->children()[i], windows);
-}
-
-// Adds the windows that can be cycled through for the specified window id to
-// |windows|.
-void AddCycleWindows(aura::RootWindow* root,
- int container_id,
- WindowCycleList::WindowList* windows) {
- aura::Window* container = Shell::GetContainer(root, container_id);
- if (container_id == internal::kShellWindowId_DefaultContainer)
- AddWorkspaceChildren(container, windows);
- else
- AddAllChildren(container, windows);
-}
-
} // namespace
//////////////////////////////////////////////////////////////////////////////
// WindowCycleController, public:
-WindowCycleController::WindowCycleController(
- aura::client::ActivationClient* activation_client)
- : activation_client_(activation_client) {
- activation_client_->AddObserver(this);
+WindowCycleController::WindowCycleController() {
}
WindowCycleController::~WindowCycleController() {
- Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
- for (Shell::RootWindowList::const_iterator iter = root_windows.begin();
- iter != root_windows.end(); ++iter) {
- for (size_t i = 0; i < arraysize(kContainerIds); ++i) {
- aura::Window* container = Shell::GetContainer(*iter, kContainerIds[i]);
- if (container)
- container->RemoveObserver(this);
- }
- aura::Window* default_container =
- Shell::GetContainer(*iter, internal::kShellWindowId_DefaultContainer);
- if (default_container) {
- for (size_t i = 0; i < default_container->children().size(); ++i) {
- aura::Window* workspace_window = default_container->children()[i];
- DCHECK_EQ(internal::kShellWindowId_WorkspaceContainer,
- workspace_window->id());
- workspace_window->RemoveObserver(this);
- }
- }
- }
-
- activation_client_->RemoveObserver(this);
StopCycling();
}
@@ -156,7 +100,7 @@ void WindowCycleController::HandleLinearCycleWindow() {
// Use the reversed list of windows to prevent a 2-cycle of the most recent
// windows occurring.
- WindowCycleList cycle_list(BuildWindowList(NULL,true));
+ WindowCycleList cycle_list(MruWindowTracker::BuildWindowList(true));
cycle_list.Step(WindowCycleList::FORWARD);
}
@@ -164,81 +108,12 @@ void WindowCycleController::AltKeyReleased() {
StopCycling();
}
-// static
-std::vector<aura::Window*> WindowCycleController::BuildWindowList(
- const std::list<aura::Window*>* mru_windows,
- bool top_most_at_end) {
- WindowCycleList::WindowList windows;
- Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
-
- aura::RootWindow* active_root = Shell::GetActiveRootWindow();
- for (Shell::RootWindowList::const_iterator iter = root_windows.begin();
- iter != root_windows.end(); ++iter) {
- if (*iter == active_root)
- continue;
- for (size_t i = 0; i < arraysize(kContainerIds); ++i)
- AddCycleWindows(*iter, kContainerIds[i], &windows);
- }
-
- // Add windows in the active root windows last so that the topmost window
- // in the active root window becomes the front of the list.
- for (size_t i = 0; i < arraysize(kContainerIds); ++i)
- AddCycleWindows(active_root, kContainerIds[i], &windows);
-
- // Removes unfocusable windows.
- WindowCycleList::WindowList::iterator last =
- std::remove_if(
- windows.begin(),
- windows.end(),
- std::not1(std::ptr_fun(ash::wm::CanActivateWindow)));
- windows.erase(last, windows.end());
-
- // Put the windows in the mru_windows list at the head, if it's available.
- if (mru_windows) {
- // Iterate through the list backwards, so that we can move each window to
- // the front of the windows list as we find them.
- for (std::list<aura::Window*>::const_reverse_iterator ix =
- mru_windows->rbegin();
- ix != mru_windows->rend(); ++ix) {
- WindowCycleList::WindowList::iterator window =
- std::find(windows.begin(), windows.end(), *ix);
- if (window != windows.end()) {
- windows.erase(window);
- windows.push_back(*ix);
- }
- }
- }
-
- // Window cycling expects the topmost window at the front of the list.
- if (!top_most_at_end)
- std::reverse(windows.begin(), windows.end());
-
- return windows;
-}
-
-void WindowCycleController::OnRootWindowAdded(aura::RootWindow* root_window) {
- for (size_t i = 0; i < arraysize(kContainerIds); ++i) {
- aura::Window* container =
- Shell::GetContainer(root_window, kContainerIds[i]);
- container->AddObserver(this);
- }
-
- aura::Window* default_container =
- Shell::GetContainer(root_window,
- internal::kShellWindowId_DefaultContainer);
- for (size_t i = 0; i < default_container->children().size(); ++i) {
- aura::Window* workspace_window = default_container->children()[i];
- DCHECK_EQ(internal::kShellWindowId_WorkspaceContainer,
- workspace_window->id());
- workspace_window->AddObserver(this);
- }
-}
-
//////////////////////////////////////////////////////////////////////////////
// WindowCycleController, private:
void WindowCycleController::StartCycling() {
- windows_.reset(new WindowCycleList(BuildWindowList(&mru_windows_, false)));
+ windows_.reset(new WindowCycleList(ash::Shell::GetInstance()->
+ mru_window_tracker()->BuildMruWindowList()));
}
void WindowCycleController::Step(Direction direction) {
@@ -254,23 +129,6 @@ void WindowCycleController::StopCycling() {
Shell::GetInstance()->RemovePreTargetHandler(event_handler_.get());
event_handler_.reset();
}
-
- // Add the currently focused window to the MRU list
- aura::Window* active_window = wm::GetActiveWindow();
- mru_windows_.remove(active_window);
- mru_windows_.push_front(active_window);
-}
-
-// static
-bool WindowCycleController::IsTrackedContainer(aura::Window* window) {
- if (!window)
- return false;
- for (size_t i = 0; i < arraysize(kContainerIds); ++i) {
- if (window->id() == kContainerIds[i]) {
- return true;
- }
- }
- return window->id() == internal::kShellWindowId_WorkspaceContainer;
}
void WindowCycleController::InstallEventFilter() {
@@ -278,28 +136,4 @@ void WindowCycleController::InstallEventFilter() {
Shell::GetInstance()->AddPreTargetHandler(event_handler_.get());
}
-void WindowCycleController::OnWindowActivated(aura::Window* gained_active,
- aura::Window* lost_active) {
- if (gained_active && !IsCycling() &&
- IsTrackedContainer(gained_active->parent())) {
- mru_windows_.remove(gained_active);
- mru_windows_.push_front(gained_active);
- }
-}
-
-void WindowCycleController::OnWindowAdded(aura::Window* window) {
- if (window->id() == internal::kShellWindowId_WorkspaceContainer)
- window->AddObserver(this);
-}
-
-void WindowCycleController::OnWillRemoveWindow(aura::Window* window) {
- mru_windows_.remove(window);
- if (window->id() == internal::kShellWindowId_WorkspaceContainer)
- window->RemoveObserver(this);
-}
-
-void WindowCycleController::OnWindowDestroying(aura::Window* window) {
- window->RemoveObserver(this);
-}
-
} // namespace ash
« no previous file with comments | « ash/wm/window_cycle_controller.h ('k') | ash/wm/window_cycle_list.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698