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

Unified Diff: ash/wm/overview/window_selector.cc

Issue 844763006: Change overview mode to so that docked panel windows are not grouped together. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed stale pointer in ScopedTransformOverviewWindow. Created 5 years, 11 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/overview/window_selector.h ('k') | ash/wm/overview/window_selector_controller.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/wm/overview/window_selector.cc
diff --git a/ash/wm/overview/window_selector.cc b/ash/wm/overview/window_selector.cc
index 76eb46a10de22b2b98d4e610d1ea44844cbcd665..0a63e8f8265829e03a8ec472e7d46841ac6a1894 100644
--- a/ash/wm/overview/window_selector.cc
+++ b/ash/wm/overview/window_selector.cc
@@ -92,7 +92,7 @@ struct WindowSelectorItemTargetComparator
}
bool operator()(WindowSelectorItem* window) const {
- return window->Contains(target);
+ return window->GetWindow() == target;
}
const aura::Window* target;
@@ -217,8 +217,7 @@ views::Widget* CreateTextFilter(views::TextfieldController* controller,
const int WindowSelector::kTextFilterBottomEdge =
kTextFilterDistanceFromTop + kTextFilterHeight;
-WindowSelector::WindowSelector(const WindowList& windows,
- WindowSelectorDelegate* delegate)
+WindowSelector::WindowSelector(WindowSelectorDelegate* delegate)
: delegate_(delegate),
restore_focus_window_(aura::client::GetFocusClient(
Shell::GetPrimaryRootWindow())->GetFocusedWindow()),
@@ -229,11 +228,19 @@ WindowSelector::WindowSelector(const WindowList& windows,
num_items_(0),
showing_selection_widget_(false),
text_filter_string_length_(0),
- num_times_textfield_cleared_(0) {
+ num_times_textfield_cleared_(0),
+ restoring_minimized_windows_(false) {
DCHECK(delegate_);
- Shell* shell = Shell::GetInstance();
- shell->OnOverviewModeStarting();
+}
+WindowSelector::~WindowSelector() {
+ RemoveAllObservers();
+}
+
+// NOTE: The work done in Init() is not done in the constructor because it may
+// cause other, unrelated classes, (ie PanelLayoutManager) to make indirect
+// calls to restoring_minimized_windows() on a partially constructed object.
+void WindowSelector::Init(const WindowList& windows) {
if (restore_focus_window_)
restore_focus_window_->AddObserver(this);
@@ -262,20 +269,33 @@ WindowSelector::WindowSelector(const WindowList& windows,
grid_list_.push_back(grid.release());
}
- // Do not call PrepareForOverview until all items are added to window_list_ as
- // we don't want to cause any window updates until all windows in overview
- // are observed. See http://crbug.com/384495.
- for (ScopedVector<WindowGrid>::iterator iter = grid_list_.begin();
- iter != grid_list_.end(); ++iter) {
- (*iter)->PrepareForOverview();
- (*iter)->PositionWindows(true);
+ {
+ // The calls to WindowGrid::PrepareForOverview() and CreateTextFilter(...)
+ // requires some LayoutManagers (ie PanelLayoutManager) to perform layouts
+ // so that windows are correctly visible and properly animated in overview
+ // mode. Otherwise these layouts should be suppressed during overview mode
+ // so they don't conflict with overview mode animations. The
+ // |restoring_minimized_windows_| flag enables the PanelLayoutManager to
+ // make this decision.
+ base::AutoReset<bool> auto_restoring_minimized_windows(
+ &restoring_minimized_windows_, true);
+
+ // Do not call PrepareForOverview until all items are added to window_list_
+ // as we don't want to cause any window updates until all windows in
+ // overview are observed. See http://crbug.com/384495.
+ for (WindowGrid* window_grid : grid_list_) {
+ window_grid->PrepareForOverview();
+ window_grid->PositionWindows(true);
+ }
+
+ text_filter_widget_.reset(
+ CreateTextFilter(this, Shell::GetPrimaryRootWindow()));
}
DCHECK(!grid_list_.empty());
UMA_HISTOGRAM_COUNTS_100("Ash.WindowSelector.Items", num_items_);
- text_filter_widget_.reset(
- CreateTextFilter(this, Shell::GetPrimaryRootWindow()));
+ Shell* shell = Shell::GetInstance();
shell->activation_client()->AddObserver(this);
@@ -289,15 +309,12 @@ WindowSelector::WindowSelector(const WindowList& windows,
UpdateShelfVisibility();
}
-WindowSelector::~WindowSelector() {
- Shell* shell = Shell::GetInstance();
-
+// NOTE: The work done in Shutdown() is not done in the destructor because it
+// may cause other, unrelated classes, (ie PanelLayoutManager) to make indirect
+// calls to restoring_minimized_windows() on a partially destructed object.
+void WindowSelector::Shutdown() {
ResetFocusRestoreWindow(true);
- for (std::set<aura::Window*>::iterator iter = observed_windows_.begin();
- iter != observed_windows_.end(); ++iter) {
- (*iter)->RemoveObserver(this);
- }
- shell->activation_client()->RemoveObserver(this);
+ RemoveAllObservers();
aura::Window::Windows root_windows = Shell::GetAllRootWindows();
for (aura::Window::Windows::const_iterator iter = root_windows.begin();
@@ -319,12 +336,11 @@ WindowSelector::~WindowSelector() {
(*iter)->Show();
}
- shell->GetScreen()->RemoveObserver(this);
-
size_t remaining_items = 0;
- for (ScopedVector<WindowGrid>::iterator iter = grid_list_.begin();
- iter != grid_list_.end(); iter++) {
- remaining_items += (*iter)->size();
+ for (WindowGrid* window_grid : grid_list_) {
+ for (WindowSelectorItem* window_selector_item : window_grid->window_list())
+ window_selector_item->RestoreWindow();
+ remaining_items += window_grid->size();
}
DCHECK(num_items_ >= remaining_items);
@@ -347,15 +363,22 @@ WindowSelector::~WindowSelector() {
remaining_items);
}
- // TODO(flackr): Change this to OnOverviewModeEnded and move it to when
- // everything is done.
- shell->OnOverviewModeEnding();
-
// Clearing the window list resets the ignored_by_shelf flag on the windows.
grid_list_.clear();
UpdateShelfVisibility();
}
+void WindowSelector::RemoveAllObservers() {
+ Shell* shell = Shell::GetInstance();
+ for (aura::Window* window : observed_windows_)
+ window->RemoveObserver(this);
+
+ shell->activation_client()->RemoveObserver(this);
+ shell->GetScreen()->RemoveObserver(this);
+ if (restore_focus_window_)
+ restore_focus_window_->RemoveObserver(this);
+}
+
void WindowSelector::CancelSelection() {
delegate_->OnSelectionEnded();
}
@@ -409,7 +432,7 @@ bool WindowSelector::HandleKeyEvent(views::Textfield* sender,
Shell::GetInstance()->metrics()->RecordUserMetricsAction(
UMA_WINDOW_OVERVIEW_ENTER_KEY);
wm::GetWindowState(grid_list_[selected_grid_index_]->
- SelectedWindow()->SelectionWindow())->Activate();
+ SelectedWindow()->GetWindow())->Activate();
break;
default:
// Not a key we are interested in, allow the textfield to handle it.
@@ -474,7 +497,7 @@ void WindowSelector::OnWindowActivated(aura::Window* gained_active,
WindowSelectorItemTargetComparator(gained_active));
if (iter != windows.end())
- (*iter)->RestoreWindowOnExit(gained_active);
+ (*iter)->ShowWindowOnExit();
// Don't restore focus on exit if a window was just activated.
ResetFocusRestoreWindow(false);
« no previous file with comments | « ash/wm/overview/window_selector.h ('k') | ash/wm/overview/window_selector_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698