OLD | NEW |
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_overview.h" | 5 #include "ash/wm/overview/window_overview.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "ash/accessibility_delegate.h" | 9 #include "ash/accessibility_delegate.h" |
10 #include "ash/metrics/user_metrics_recorder.h" | 10 #include "ash/metrics/user_metrics_recorder.h" |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 delete this; | 113 delete this; |
114 } | 114 } |
115 | 115 |
116 void CleanupWidgetAfterAnimationObserver::OnLayerAnimationScheduled( | 116 void CleanupWidgetAfterAnimationObserver::OnLayerAnimationScheduled( |
117 ui::LayerAnimationSequence* sequence) { | 117 ui::LayerAnimationSequence* sequence) { |
118 } | 118 } |
119 | 119 |
120 } // namespace | 120 } // namespace |
121 | 121 |
122 WindowOverview::WindowOverview(WindowSelector* window_selector, | 122 WindowOverview::WindowOverview(WindowSelector* window_selector, |
123 WindowSelectorItemList* windows, | 123 WindowSelectorItemList* windows) |
124 aura::Window* single_root_window) | |
125 : window_selector_(window_selector), | 124 : window_selector_(window_selector), |
126 windows_(windows), | 125 windows_(windows), |
127 selection_index_(0), | 126 selection_index_(0), |
128 single_root_window_(single_root_window), | |
129 overview_start_time_(base::Time::Now()), | 127 overview_start_time_(base::Time::Now()), |
130 cursor_client_(NULL) { | 128 cursor_client_(NULL) { |
131 Shell* shell = Shell::GetInstance(); | 129 Shell* shell = Shell::GetInstance(); |
132 shell->OnOverviewModeStarting(); | 130 shell->OnOverviewModeStarting(); |
133 for (WindowSelectorItemList::iterator iter = windows_->begin(); | 131 for (WindowSelectorItemList::iterator iter = windows_->begin(); |
134 iter != windows_->end(); ++iter) { | 132 iter != windows_->end(); ++iter) { |
135 (*iter)->PrepareForOverview(); | 133 (*iter)->PrepareForOverview(); |
136 } | 134 } |
137 PositionWindows(/* animate */ true); | 135 PositionWindows(/* animate */ true); |
138 DCHECK(!windows_->empty()); | 136 DCHECK(!windows_->empty()); |
139 cursor_client_ = aura::client::GetCursorClient( | 137 cursor_client_ = aura::client::GetCursorClient( |
140 windows_->front()->GetRootWindow()); | 138 windows_->front()->GetRootWindow()); |
141 if (cursor_client_) { | 139 if (cursor_client_) { |
142 cursor_client_->SetCursor(ui::kCursorPointer); | 140 cursor_client_->SetCursor(ui::kCursorPointer); |
143 cursor_client_->ShowCursor(); | 141 cursor_client_->ShowCursor(); |
144 // TODO(flackr): Only prevent cursor changes for windows in the overview. | 142 // TODO(flackr): Only prevent cursor changes for windows in the overview. |
145 // This will be easier to do without exposing the overview mode code if the | 143 // This will be easier to do without exposing the overview mode code if the |
146 // cursor changes are moved to ToplevelWindowEventHandler::HandleMouseMoved | 144 // cursor changes are moved to ToplevelWindowEventHandler::HandleMouseMoved |
147 // as suggested there. | 145 // as suggested there. |
148 cursor_client_->LockCursor(); | 146 cursor_client_->LockCursor(); |
149 } | 147 } |
150 shell->PrependPreTargetHandler(this); | 148 shell->PrependPreTargetHandler(this); |
151 shell->GetScreen()->AddObserver(this); | 149 shell->GetScreen()->AddObserver(this); |
152 shell->metrics()->RecordUserMetricsAction(UMA_WINDOW_OVERVIEW); | 150 shell->metrics()->RecordUserMetricsAction(UMA_WINDOW_OVERVIEW); |
153 HideAndTrackNonOverviewWindows(); | 151 HideAndTrackNonOverviewWindows(); |
154 // Send an a11y alert only if the overview was activated by the user. | 152 // Send an a11y alert |
155 if (window_selector_->mode() == WindowSelector::OVERVIEW) { | 153 shell->accessibility_delegate()->TriggerAccessibilityAlert( |
156 shell->accessibility_delegate()->TriggerAccessibilityAlert( | 154 A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED); |
157 A11Y_ALERT_WINDOW_OVERVIEW_MODE_ENTERED); | |
158 } | |
159 } | 155 } |
160 | 156 |
161 WindowOverview::~WindowOverview() { | 157 WindowOverview::~WindowOverview() { |
162 const aura::WindowTracker::Windows hidden_windows = hidden_windows_.windows(); | 158 const aura::WindowTracker::Windows hidden_windows = hidden_windows_.windows(); |
163 for (aura::WindowTracker::Windows::const_iterator iter = | 159 for (aura::WindowTracker::Windows::const_iterator iter = |
164 hidden_windows.begin(); iter != hidden_windows.end(); ++iter) { | 160 hidden_windows.begin(); iter != hidden_windows.end(); ++iter) { |
165 ui::ScopedLayerAnimationSettings settings( | 161 ui::ScopedLayerAnimationSettings settings( |
166 (*iter)->layer()->GetAnimator()); | 162 (*iter)->layer()->GetAnimator()); |
167 settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds( | 163 settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds( |
168 ScopedTransformOverviewWindow::kTransitionMilliseconds)); | 164 ScopedTransformOverviewWindow::kTransitionMilliseconds)); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 InitializeSelectionWidget(); | 243 InitializeSelectionWidget(); |
248 selection_widget_->SetBounds(target_bounds); | 244 selection_widget_->SetBounds(target_bounds); |
249 } | 245 } |
250 selection_index_ = index; | 246 selection_index_ = index; |
251 } | 247 } |
252 | 248 |
253 void WindowOverview::OnWindowsChanged() { | 249 void WindowOverview::OnWindowsChanged() { |
254 PositionWindows(/* animate */ true); | 250 PositionWindows(/* animate */ true); |
255 } | 251 } |
256 | 252 |
257 void WindowOverview::MoveToSingleRootWindow(aura::Window* root_window) { | |
258 single_root_window_ = root_window; | |
259 PositionWindows(/* animate */ true); | |
260 } | |
261 | |
262 void WindowOverview::OnKeyEvent(ui::KeyEvent* event) { | 253 void WindowOverview::OnKeyEvent(ui::KeyEvent* event) { |
263 if (GetTargetedWindow(static_cast<aura::Window*>(event->target()))) | 254 if (GetTargetedWindow(static_cast<aura::Window*>(event->target()))) |
264 event->StopPropagation(); | 255 event->StopPropagation(); |
265 if (event->type() != ui::ET_KEY_PRESSED) | 256 if (event->type() != ui::ET_KEY_PRESSED) |
266 return; | 257 return; |
267 | 258 |
268 if (event->key_code() == ui::VKEY_ESCAPE) | 259 if (event->key_code() == ui::VKEY_ESCAPE) |
269 window_selector_->CancelSelection(); | 260 window_selector_->CancelSelection(); |
270 } | 261 } |
271 | 262 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 362 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
372 (*iter)->Hide(); | 363 (*iter)->Hide(); |
373 // Hiding the window can result in it being destroyed. | 364 // Hiding the window can result in it being destroyed. |
374 if (!hidden_windows_.Contains(*iter)) | 365 if (!hidden_windows_.Contains(*iter)) |
375 continue; | 366 continue; |
376 (*iter)->layer()->SetOpacity(0); | 367 (*iter)->layer()->SetOpacity(0); |
377 } | 368 } |
378 } | 369 } |
379 | 370 |
380 void WindowOverview::PositionWindows(bool animate) { | 371 void WindowOverview::PositionWindows(bool animate) { |
381 if (single_root_window_) { | 372 aura::Window::Windows root_window_list = Shell::GetAllRootWindows(); |
382 std::vector<WindowSelectorItem*> windows; | 373 for (size_t i = 0; i < root_window_list.size(); ++i) |
383 for (WindowSelectorItemList::iterator iter = windows_->begin(); | 374 PositionWindowsFromRoot(root_window_list[i], animate); |
384 iter != windows_->end(); ++iter) { | |
385 windows.push_back(*iter); | |
386 } | |
387 PositionWindowsOnRoot(single_root_window_, windows, animate); | |
388 } else { | |
389 aura::Window::Windows root_window_list = Shell::GetAllRootWindows(); | |
390 for (size_t i = 0; i < root_window_list.size(); ++i) | |
391 PositionWindowsFromRoot(root_window_list[i], animate); | |
392 } | |
393 } | 375 } |
394 | 376 |
395 void WindowOverview::PositionWindowsFromRoot(aura::Window* root_window, | 377 void WindowOverview::PositionWindowsFromRoot(aura::Window* root_window, |
396 bool animate) { | 378 bool animate) { |
397 std::vector<WindowSelectorItem*> windows; | 379 std::vector<WindowSelectorItem*> windows; |
398 for (WindowSelectorItemList::iterator iter = windows_->begin(); | 380 for (WindowSelectorItemList::iterator iter = windows_->begin(); |
399 iter != windows_->end(); ++iter) { | 381 iter != windows_->end(); ++iter) { |
400 if ((*iter)->GetRootWindow() == root_window) | 382 if ((*iter)->GetRootWindow() == root_window) |
401 windows.push_back(*iter); | 383 windows.push_back(*iter); |
402 } | 384 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 } | 430 } |
449 | 431 |
450 void WindowOverview::InitializeSelectionWidget() { | 432 void WindowOverview::InitializeSelectionWidget() { |
451 selection_widget_.reset(new views::Widget); | 433 selection_widget_.reset(new views::Widget); |
452 views::Widget::InitParams params; | 434 views::Widget::InitParams params; |
453 params.type = views::Widget::InitParams::TYPE_POPUP; | 435 params.type = views::Widget::InitParams::TYPE_POPUP; |
454 params.can_activate = false; | 436 params.can_activate = false; |
455 params.keep_on_top = false; | 437 params.keep_on_top = false; |
456 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 438 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
457 params.opacity = views::Widget::InitParams::OPAQUE_WINDOW; | 439 params.opacity = views::Widget::InitParams::OPAQUE_WINDOW; |
458 params.parent = Shell::GetContainer(single_root_window_ | 440 params.parent = Shell::GetContainer(windows_->front()->GetRootWindow(), |
459 ? single_root_window_ | |
460 : windows_->front()->GetRootWindow(), | |
461 kShellWindowId_DefaultContainer); | 441 kShellWindowId_DefaultContainer); |
462 params.accept_events = false; | 442 params.accept_events = false; |
463 selection_widget_->set_focus_on_creation(false); | 443 selection_widget_->set_focus_on_creation(false); |
464 selection_widget_->Init(params); | 444 selection_widget_->Init(params); |
465 views::View* content_view = new views::View; | 445 views::View* content_view = new views::View; |
466 content_view->set_background( | 446 content_view->set_background( |
467 views::Background::CreateSolidBackground(kWindowOverviewSelectionColor)); | 447 views::Background::CreateSolidBackground(kWindowOverviewSelectionColor)); |
468 selection_widget_->SetContentsView(content_view); | 448 selection_widget_->SetContentsView(content_view); |
469 selection_widget_->Show(); | 449 selection_widget_->Show(); |
470 selection_widget_->GetNativeWindow()->parent()->StackChildAtBottom( | 450 selection_widget_->GetNativeWindow()->parent()->StackChildAtBottom( |
471 selection_widget_->GetNativeWindow()); | 451 selection_widget_->GetNativeWindow()); |
472 selection_widget_->GetNativeWindow()->layer()->SetOpacity( | 452 selection_widget_->GetNativeWindow()->layer()->SetOpacity( |
473 kWindowOverviewSelectionOpacity); | 453 kWindowOverviewSelectionOpacity); |
474 } | 454 } |
475 | 455 |
476 gfx::Rect WindowOverview::GetSelectionBounds(size_t index) { | 456 gfx::Rect WindowOverview::GetSelectionBounds(size_t index) { |
477 gfx::Rect bounds((*windows_)[index]->bounds()); | 457 gfx::Rect bounds((*windows_)[index]->bounds()); |
478 bounds.Inset(-kWindowOverviewSelectionPadding, | 458 bounds.Inset(-kWindowOverviewSelectionPadding, |
479 -kWindowOverviewSelectionPadding); | 459 -kWindowOverviewSelectionPadding); |
480 return bounds; | 460 return bounds; |
481 } | 461 } |
482 | 462 |
483 } // namespace ash | 463 } // namespace ash |
OLD | NEW |