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

Side by Side 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: Polished after a self-review. 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/wm/overview/window_selector.h" 5 #include "ash/wm/overview/window_selector.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 }; 85 };
86 86
87 // A comparator for locating a selectable window given a targeted window. 87 // A comparator for locating a selectable window given a targeted window.
88 struct WindowSelectorItemTargetComparator 88 struct WindowSelectorItemTargetComparator
89 : public std::unary_function<WindowSelectorItem*, bool> { 89 : public std::unary_function<WindowSelectorItem*, bool> {
90 explicit WindowSelectorItemTargetComparator(const aura::Window* target_window) 90 explicit WindowSelectorItemTargetComparator(const aura::Window* target_window)
91 : target(target_window) { 91 : target(target_window) {
92 } 92 }
93 93
94 bool operator()(WindowSelectorItem* window) const { 94 bool operator()(WindowSelectorItem* window) const {
95 return window->Contains(target); 95 return window->GetWindow() == target;
96 } 96 }
97 97
98 const aura::Window* target; 98 const aura::Window* target;
99 }; 99 };
100 100
101 // A comparator for locating a selector item for a given root. 101 // A comparator for locating a selector item for a given root.
102 struct WindowSelectorItemForRoot 102 struct WindowSelectorItemForRoot
103 : public std::unary_function<WindowSelectorItem*, bool> { 103 : public std::unary_function<WindowSelectorItem*, bool> {
104 explicit WindowSelectorItemForRoot(const aura::Window* root) 104 explicit WindowSelectorItemForRoot(const aura::Window* root)
105 : root_window(root) { 105 : root_window(root) {
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 textfield->RequestFocus(); 210 textfield->RequestFocus();
211 211
212 return widget; 212 return widget;
213 } 213 }
214 214
215 } // namespace 215 } // namespace
216 216
217 const int WindowSelector::kTextFilterBottomEdge = 217 const int WindowSelector::kTextFilterBottomEdge =
218 kTextFilterDistanceFromTop + kTextFilterHeight; 218 kTextFilterDistanceFromTop + kTextFilterHeight;
219 219
220 WindowSelector::WindowSelector(const WindowList& windows, 220 WindowSelector::WindowSelector(WindowSelectorDelegate* delegate)
221 WindowSelectorDelegate* delegate)
222 : delegate_(delegate), 221 : delegate_(delegate),
223 restore_focus_window_(aura::client::GetFocusClient( 222 restore_focus_window_(aura::client::GetFocusClient(
224 Shell::GetPrimaryRootWindow())->GetFocusedWindow()), 223 Shell::GetPrimaryRootWindow())->GetFocusedWindow()),
225 ignore_activations_(false), 224 ignore_activations_(false),
226 selected_grid_index_(0), 225 selected_grid_index_(0),
227 overview_start_time_(base::Time::Now()), 226 overview_start_time_(base::Time::Now()),
228 num_key_presses_(0), 227 num_key_presses_(0),
229 num_items_(0), 228 num_items_(0),
230 showing_selection_widget_(false), 229 showing_selection_widget_(false),
231 text_filter_string_length_(0), 230 text_filter_string_length_(0),
232 num_times_textfield_cleared_(0) { 231 num_times_textfield_cleared_(0),
232 restoring_minimized_windows_(false) {
233 DCHECK(delegate_); 233 DCHECK(delegate_);
234 }
235
236 WindowSelector::~WindowSelector() {
237 }
238
239 void WindowSelector::Init(const WindowList& windows) {
234 Shell* shell = Shell::GetInstance(); 240 Shell* shell = Shell::GetInstance();
235 shell->OnOverviewModeStarting(); 241 shell->OnOverviewModeStarting();
236 242
237 if (restore_focus_window_) 243 if (restore_focus_window_)
238 restore_focus_window_->AddObserver(this); 244 restore_focus_window_->AddObserver(this);
239 245
240 const aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 246 const aura::Window::Windows root_windows = Shell::GetAllRootWindows();
241 for (aura::Window::Windows::const_iterator iter = root_windows.begin(); 247 for (aura::Window::Windows::const_iterator iter = root_windows.begin();
242 iter != root_windows.end(); iter++) { 248 iter != root_windows.end(); iter++) {
243 // Observed switchable containers for newly created windows on all root 249 // Observed switchable containers for newly created windows on all root
(...skipping 11 matching lines...) Expand all
255 Shell::GetContainer(*iter, kShellWindowId_PanelContainer) 261 Shell::GetContainer(*iter, kShellWindowId_PanelContainer)
256 ->layout_manager())->SetShowCalloutWidgets(false); 262 ->layout_manager())->SetShowCalloutWidgets(false);
257 263
258 scoped_ptr<WindowGrid> grid(new WindowGrid(*iter, windows, this)); 264 scoped_ptr<WindowGrid> grid(new WindowGrid(*iter, windows, this));
259 if (grid->empty()) 265 if (grid->empty())
260 continue; 266 continue;
261 num_items_ += grid->size(); 267 num_items_ += grid->size();
262 grid_list_.push_back(grid.release()); 268 grid_list_.push_back(grid.release());
263 } 269 }
264 270
265 // Do not call PrepareForOverview until all items are added to window_list_ as 271 {
266 // we don't want to cause any window updates until all windows in overview 272 // The calls to WindowGrid::PrepareForOverview() and CreateTextFilter(...)
267 // are observed. See http://crbug.com/384495. 273 // requires some LayoutManagers (ie PanelLayoutManager) to perform layouts
268 for (ScopedVector<WindowGrid>::iterator iter = grid_list_.begin(); 274 // so that windows are correctly visible and properly animated in overview
269 iter != grid_list_.end(); ++iter) { 275 // mode. Otherwise these layouts should be suppressed during overview mode
270 (*iter)->PrepareForOverview(); 276 // so they don't conflict with overview mode animations. The
271 (*iter)->PositionWindows(true); 277 // |restoring_minimized_windows_| flag enables the PanelLayoutManager to
278 // make this decision.
279 base::AutoReset<bool> auto_restoring_minimized_windows_(
280 &restoring_minimized_windows_, true);
281
282 // Do not call PrepareForOverview until all items are added to window_list_
283 // as we don't want to cause any window updates until all windows in
284 // overview are observed. See http://crbug.com/384495.
285 for (ScopedVector<WindowGrid>::iterator iter = grid_list_.begin();
jonross 2015/01/15 13:37:47 switch to for(auto iter : grid_list_)
bruthig 2015/01/15 18:27:25 Done.
286 iter != grid_list_.end(); ++iter) {
287 (*iter)->PrepareForOverview();
288 (*iter)->PositionWindows(true);
289 }
290
291 text_filter_widget_.reset(
292 CreateTextFilter(this, Shell::GetPrimaryRootWindow()));
272 } 293 }
273 294
274 DCHECK(!grid_list_.empty()); 295 DCHECK(!grid_list_.empty());
275 UMA_HISTOGRAM_COUNTS_100("Ash.WindowSelector.Items", num_items_); 296 UMA_HISTOGRAM_COUNTS_100("Ash.WindowSelector.Items", num_items_);
276 297
277 text_filter_widget_.reset(
278 CreateTextFilter(this, Shell::GetPrimaryRootWindow()));
279
280 shell->activation_client()->AddObserver(this); 298 shell->activation_client()->AddObserver(this);
281 299
282 shell->GetScreen()->AddObserver(this); 300 shell->GetScreen()->AddObserver(this);
283 shell->metrics()->RecordUserMetricsAction(UMA_WINDOW_OVERVIEW); 301 shell->metrics()->RecordUserMetricsAction(UMA_WINDOW_OVERVIEW);
284 HideAndTrackNonOverviewWindows(); 302 HideAndTrackNonOverviewWindows();
285 // Send an a11y alert. 303 // Send an a11y alert.
286 shell->accessibility_delegate()->TriggerAccessibilityAlert( 304 shell->accessibility_delegate()->TriggerAccessibilityAlert(
287 ui::A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED); 305 ui::A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED);
288 306
289 UpdateShelfVisibility(); 307 UpdateShelfVisibility();
290 } 308 }
291 309
292 WindowSelector::~WindowSelector() { 310 void WindowSelector::Shutdown() {
293 Shell* shell = Shell::GetInstance(); 311 Shell* shell = Shell::GetInstance();
294 312
295 ResetFocusRestoreWindow(true); 313 ResetFocusRestoreWindow(true);
296 for (std::set<aura::Window*>::iterator iter = observed_windows_.begin(); 314 for (std::set<aura::Window*>::iterator iter = observed_windows_.begin();
297 iter != observed_windows_.end(); ++iter) { 315 iter != observed_windows_.end(); ++iter) {
298 (*iter)->RemoveObserver(this); 316 (*iter)->RemoveObserver(this);
299 } 317 }
300 shell->activation_client()->RemoveObserver(this); 318 shell->activation_client()->RemoveObserver(this);
301 319
302 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); 320 aura::Window::Windows root_windows = Shell::GetAllRootWindows();
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 if (!grid_list_[selected_grid_index_]->is_selecting()) 420 if (!grid_list_[selected_grid_index_]->is_selecting())
403 return false; 421 return false;
404 UMA_HISTOGRAM_COUNTS_100("Ash.WindowSelector.ArrowKeyPresses", 422 UMA_HISTOGRAM_COUNTS_100("Ash.WindowSelector.ArrowKeyPresses",
405 num_key_presses_); 423 num_key_presses_);
406 UMA_HISTOGRAM_CUSTOM_COUNTS( 424 UMA_HISTOGRAM_CUSTOM_COUNTS(
407 "Ash.WindowSelector.KeyPressesOverItemsRatio", 425 "Ash.WindowSelector.KeyPressesOverItemsRatio",
408 (num_key_presses_ * 100) / num_items_, 1, 300, 30); 426 (num_key_presses_ * 100) / num_items_, 1, 300, 30);
409 Shell::GetInstance()->metrics()->RecordUserMetricsAction( 427 Shell::GetInstance()->metrics()->RecordUserMetricsAction(
410 UMA_WINDOW_OVERVIEW_ENTER_KEY); 428 UMA_WINDOW_OVERVIEW_ENTER_KEY);
411 wm::GetWindowState(grid_list_[selected_grid_index_]-> 429 wm::GetWindowState(grid_list_[selected_grid_index_]->
412 SelectedWindow()->SelectionWindow())->Activate(); 430 SelectedWindow()->GetWindow())->Activate();
413 break; 431 break;
414 default: 432 default:
415 // Not a key we are interested in, allow the textfield to handle it. 433 // Not a key we are interested in, allow the textfield to handle it.
416 return false; 434 return false;
417 } 435 }
418 return true; 436 return true;
419 } 437 }
420 438
421 void WindowSelector::OnDisplayAdded(const gfx::Display& display) { 439 void WindowSelector::OnDisplayAdded(const gfx::Display& display) {
422 } 440 }
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 for (size_t i = 0; 613 for (size_t i = 0;
596 i <= grid_list_.size() && 614 i <= grid_list_.size() &&
597 grid_list_[selected_grid_index_]->Move(direction, animate); i++) { 615 grid_list_[selected_grid_index_]->Move(direction, animate); i++) {
598 // TODO(flackr): If there are more than two monitors, move between grids 616 // TODO(flackr): If there are more than two monitors, move between grids
599 // in the requested direction. 617 // in the requested direction.
600 selected_grid_index_ = (selected_grid_index_ + 1) % grid_list_.size(); 618 selected_grid_index_ = (selected_grid_index_ + 1) % grid_list_.size();
601 } 619 }
602 } 620 }
603 621
604 } // namespace ash 622 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698