summaryrefslogtreecommitdiffstats
path: root/ash/wm/overview/window_selector.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ash/wm/overview/window_selector.cc')
-rw-r--r--ash/wm/overview/window_selector.cc100
1 files changed, 27 insertions, 73 deletions
diff --git a/ash/wm/overview/window_selector.cc b/ash/wm/overview/window_selector.cc
index 913727e..a741afd 100644
--- a/ash/wm/overview/window_selector.cc
+++ b/ash/wm/overview/window_selector.cc
@@ -10,9 +10,7 @@
#include "ash/wm/mru_window_tracker.h"
#include "ash/wm/overview/window_overview.h"
#include "ash/wm/overview/window_selector_delegate.h"
-#include "ash/wm/overview/window_selector_panels.h"
#include "ash/wm/overview/window_selector_window.h"
-#include "ash/wm/window_settings.h"
#include "base/auto_reset.h"
#include "base/timer/timer.h"
#include "ui/aura/client/activation_client.h"
@@ -29,33 +27,19 @@ namespace {
const int kOverviewDelayOnCycleMilliseconds = 300;
// A comparator for locating a given target window.
-struct WindowSelectorItemComparator
- : public std::unary_function<WindowSelectorItem*, bool> {
- explicit WindowSelectorItemComparator(const aura::Window* target_window)
+struct WindowSelectorWindowComparator
+ : public std::unary_function<WindowSelectorWindow*, bool> {
+ explicit WindowSelectorWindowComparator(const aura::Window* target_window)
: target(target_window) {
}
- bool operator()(const WindowSelectorItem* window) const {
- return window->TargetedWindow(target) != NULL;
+ bool operator()(const WindowSelectorWindow* window) const {
+ return target == window->window();
}
const aura::Window* target;
};
-// A comparator for locating a selector item for a given root.
-struct WindowSelectorItemForRoot
- : public std::unary_function<WindowSelectorItem*, bool> {
- explicit WindowSelectorItemForRoot(const aura::RootWindow* root)
- : root_window(root) {
- }
-
- bool operator()(const WindowSelectorItem* item) const {
- return item->GetRootWindow() == root_window;
- }
-
- const aura::RootWindow* root_window;
-};
-
// Filter to watch for the termination of a keyboard gesture to cycle through
// multiple windows.
class WindowSelectorEventFilter : public ui::EventHandler {
@@ -106,32 +90,14 @@ WindowSelector::WindowSelector(const WindowList& windows,
restore_focus_window_(NULL),
restoring_focus_(false) {
DCHECK(delegate_);
- std::vector<WindowSelectorPanels*> panels_items;
+ RemoveFocusAndSetRestoreWindow();
for (size_t i = 0; i < windows.size(); ++i) {
- windows[i]->AddObserver(this);
- observed_windows_.insert(windows[i]);
-
- if (windows[i]->type() == aura::client::WINDOW_TYPE_PANEL &&
- wm::GetWindowSettings(windows[i])->panel_attached()) {
- // Attached panel windows are grouped into a single overview item per
- // root window (display).
- std::vector<WindowSelectorPanels*>::iterator iter =
- std::find_if(panels_items.begin(), panels_items.end(),
- WindowSelectorItemForRoot(windows[i]->GetRootWindow()));
- WindowSelectorPanels* panels_item = NULL;
- if (iter == panels_items.end()) {
- panels_item = new WindowSelectorPanels();
- panels_items.push_back(panels_item);
- windows_.push_back(panels_item);
- } else {
- panels_item = *iter;
- }
- panels_item->AddWindow(windows[i]);
- } else {
- windows_.push_back(new WindowSelectorWindow(windows[i]));
- }
+ // restore_focus_window_ is already observed from the call to
+ // RemoveFocusAndSetRestoreWindow.
+ if (windows[i] != restore_focus_window_)
+ windows[i]->AddObserver(this);
+ windows_.push_back(new WindowSelectorWindow(windows[i]));
}
- RemoveFocusAndSetRestoreWindow();
// Observe window activations and switchable containers on all root windows
// for newly created windows during overview.
@@ -155,9 +121,8 @@ WindowSelector::WindowSelector(const WindowList& windows,
WindowSelector::~WindowSelector() {
ResetFocusRestoreWindow(true);
- for (std::set<aura::Window*>::iterator iter = observed_windows_.begin();
- iter != observed_windows_.end(); ++iter) {
- (*iter)->RemoveObserver(this);
+ for (size_t i = 0; i < windows_.size(); i++) {
+ windows_[i]->window()->RemoveObserver(this);
}
Shell::GetInstance()->activation_client()->RemoveObserver(this);
Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
@@ -178,8 +143,7 @@ void WindowSelector::Step(WindowSelector::Direction direction) {
if (window_overview_) {
window_overview_->SetSelection(selected_window_);
} else {
- aura::Window* current_window =
- windows_[selected_window_]->SelectionWindow();
+ aura::Window* current_window = windows_[selected_window_]->window();
current_window->Show();
current_window->SetTransform(gfx::Transform());
current_window->parent()->StackChildAtTop(current_window);
@@ -189,17 +153,17 @@ void WindowSelector::Step(WindowSelector::Direction direction) {
void WindowSelector::SelectWindow() {
ResetFocusRestoreWindow(false);
- SelectWindow(windows_[selected_window_]->SelectionWindow());
+ SelectWindow(windows_[selected_window_]->window());
}
void WindowSelector::SelectWindow(aura::Window* window) {
- ScopedVector<WindowSelectorItem>::iterator iter =
+ ScopedVector<WindowSelectorWindow>::iterator iter =
std::find_if(windows_.begin(), windows_.end(),
- WindowSelectorItemComparator(window));
+ WindowSelectorWindowComparator(window));
DCHECK(iter != windows_.end());
// The selected window should not be minimized when window selection is
// ended.
- (*iter)->RestoreWindowOnExit(window);
+ (*iter)->RestoreWindowOnExit();
delegate_->OnWindowSelected(window);
}
@@ -224,9 +188,9 @@ void WindowSelector::OnWindowAdded(aura::Window* new_window) {
}
void WindowSelector::OnWindowDestroyed(aura::Window* window) {
- ScopedVector<WindowSelectorItem>::iterator iter =
+ ScopedVector<WindowSelectorWindow>::iterator iter =
std::find_if(windows_.begin(), windows_.end(),
- WindowSelectorItemComparator(window));
+ WindowSelectorWindowComparator(window));
DCHECK(window == restore_focus_window_ || iter != windows_.end());
window->RemoveObserver(this);
if (window == restore_focus_window_)
@@ -234,21 +198,14 @@ void WindowSelector::OnWindowDestroyed(aura::Window* window) {
if (iter == windows_.end())
return;
- observed_windows_.erase(window);
- (*iter)->RemoveWindow(window);
- // If there are still windows in this selector entry then the overview is
- // still active and the active selection remains the same.
- if (!(*iter)->empty())
- return;
-
size_t deleted_index = iter - windows_.begin();
+ (*iter)->OnWindowDestroyed();
windows_.erase(iter);
if (windows_.empty()) {
CancelSelection();
return;
}
- if (window_overview_)
- window_overview_->OnWindowsChanged();
+ window_overview_->OnWindowsChanged();
if (mode_ == CYCLE && selected_window_ >= deleted_index) {
if (selected_window_ > deleted_index)
selected_window_--;
@@ -291,10 +248,7 @@ void WindowSelector::RemoveFocusAndSetRestoreWindow() {
restore_focus_window_ = focus_client->GetFocusedWindow();
if (restore_focus_window_) {
focus_client->FocusWindow(NULL);
- if (observed_windows_.find(restore_focus_window_) ==
- observed_windows_.end()) {
- restore_focus_window_->AddObserver(this);
- }
+ restore_focus_window_->AddObserver(this);
}
}
@@ -305,10 +259,10 @@ void WindowSelector::ResetFocusRestoreWindow(bool focus) {
base::AutoReset<bool> restoring_focus(&restoring_focus_, true);
restore_focus_window_->Focus();
}
- // If the window is in the observed_windows_ list it needs to continue to be
- // observed.
- if (observed_windows_.find(restore_focus_window_) ==
- observed_windows_.end()) {
+ // If the window is in the windows_ list it needs to continue to be observed.
+ if (std::find_if(windows_.begin(), windows_.end(),
+ WindowSelectorWindowComparator(restore_focus_window_)) ==
+ windows_.end()) {
restore_focus_window_->RemoveObserver(this);
}
restore_focus_window_ = NULL;