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

Side by Side Diff: athena/wm/window_overview_mode.cc

Issue 546123002: Ensure that an activity is activated when overview mode is exited (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "athena/wm/window_overview_mode.h" 5 #include "athena/wm/window_overview_mode.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 #include <vector> 9 #include <vector>
10 10
11 #include "athena/wm/overview_toolbar.h" 11 #include "athena/wm/overview_toolbar.h"
12 #include "athena/wm/public/window_list_provider.h" 12 #include "athena/wm/public/window_list_provider.h"
13 #include "athena/wm/split_view_controller.h" 13 #include "athena/wm/split_view_controller.h"
14 #include "base/bind.h" 14 #include "base/bind.h"
15 #include "base/macros.h" 15 #include "base/macros.h"
16 #include "ui/aura/scoped_window_targeter.h" 16 #include "ui/aura/scoped_window_targeter.h"
17 #include "ui/aura/window.h" 17 #include "ui/aura/window.h"
18 #include "ui/aura/window_delegate.h" 18 #include "ui/aura/window_delegate.h"
19 #include "ui/aura/window_property.h" 19 #include "ui/aura/window_property.h"
20 #include "ui/aura/window_targeter.h" 20 #include "ui/aura/window_targeter.h"
21 #include "ui/aura/window_tree_host.h" 21 #include "ui/aura/window_tree_host.h"
22 #include "ui/compositor/closure_animation_observer.h" 22 #include "ui/compositor/closure_animation_observer.h"
23 #include "ui/compositor/compositor.h" 23 #include "ui/compositor/compositor.h"
24 #include "ui/compositor/compositor_animation_observer.h" 24 #include "ui/compositor/compositor_animation_observer.h"
25 #include "ui/compositor/layer_animation_observer.h"
25 #include "ui/compositor/scoped_layer_animation_settings.h" 26 #include "ui/compositor/scoped_layer_animation_settings.h"
26 #include "ui/events/event_handler.h" 27 #include "ui/events/event_handler.h"
27 #include "ui/events/gestures/fling_curve.h" 28 #include "ui/events/gestures/fling_curve.h"
28 #include "ui/gfx/frame_time.h" 29 #include "ui/gfx/frame_time.h"
29 #include "ui/gfx/transform.h" 30 #include "ui/gfx/transform.h"
30 #include "ui/wm/core/shadow_types.h" 31 #include "ui/wm/core/shadow_types.h"
31 #include "ui/wm/core/window_util.h" 32 #include "ui/wm/core/window_util.h"
32 33
33 namespace { 34 namespace {
34 35
(...skipping 26 matching lines...) Expand all
61 state->bottom); 62 state->bottom);
62 } 63 }
63 64
64 // Sets the progress-state for the window in the overview mode. 65 // Sets the progress-state for the window in the overview mode.
65 void SetWindowProgress(aura::Window* window, float progress) { 66 void SetWindowProgress(aura::Window* window, float progress) {
66 WindowOverviewState* state = window->GetProperty(kWindowOverviewState); 67 WindowOverviewState* state = window->GetProperty(kWindowOverviewState);
67 state->progress = progress; 68 state->progress = progress;
68 window->SetTransform(GetTransformForState(state)); 69 window->SetTransform(GetTransformForState(state));
69 } 70 }
70 71
71 void HideWindowIfNotVisible(aura::Window* window, 72 void HideWindowIfTransparent(aura::Window* window) {
72 SplitViewController* split_view_controller) { 73 if (window->layer()->opacity() == 0.0f) {
73 bool should_hide = true; 74 window->Hide();
74 if (split_view_controller->IsSplitViewModeActive()) { 75 window->layer()->SetOpacity(1.0f);
75 should_hide = window != split_view_controller->left_window() &&
76 window != split_view_controller->right_window();
77 } else {
78 should_hide = !wm::IsActiveWindow(window);
79 } 76 }
80 if (should_hide)
81 window->Hide();
82 } 77 }
83 78
84 // Resets the overview-related state for |window|. 79 // Resets the overview-related state for |window|.
85 void RestoreWindowState(aura::Window* window, 80 void RestoreWindowState(aura::Window* window) {
86 SplitViewController* split_view_controller) {
87 window->ClearProperty(kWindowOverviewState); 81 window->ClearProperty(kWindowOverviewState);
82 wm::SetShadowType(window, wm::SHADOW_TYPE_NONE);
88 83
89 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); 84 {
90 settings.SetPreemptionStrategy( 85 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator());
91 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 86 settings.SetPreemptionStrategy(
92 settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(250)); 87 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
88 settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(250));
89 window->SetTransform(gfx::Transform());
90 }
93 91
94 settings.AddObserver(new ui::ClosureAnimationObserver( 92 {
95 base::Bind(&HideWindowIfNotVisible, window, split_view_controller))); 93 ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator());
94 settings.SetPreemptionStrategy(
95 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
96 settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(250));
97 settings.AddObserver(new ui::ClosureAnimationObserver(
98 base::Bind(&HideWindowIfTransparent, base::Unretained(window))));
96 99
97 window->SetTransform(gfx::Transform()); 100 // The window opacity may not be 1.0f if the user was dragging a window.
101 window->layer()->SetOpacity(1.0f);
98 102
99 // Reset the window opacity in case the user is dragging a window. 103 // Ideally we would animate the window's visibility. However, animating the
100 window->layer()->SetOpacity(1.0f); 104 // window's visibility causes the web contents to hide before the animation
101 105 // completes. Enqueue a zero duration opacity animation and hide |window|
102 wm::SetShadowType(window, wm::SHADOW_TYPE_NONE); 106 // unless the opacity animation is aborted.
107 settings.SetPreemptionStrategy(
108 ui::LayerAnimator::ENQUEUE_NEW_ANIMATION);
109 settings.SetTransitionDuration(base::TimeDelta());
110 window->layer()->SetOpacity(0.0f);
111 }
sadrul 2014/09/07 05:26:49 Can you explain this change in RestoreWindowState(
pkotwicz 2014/09/08 19:39:23 I ended up keeping the old logic and making SplitV
103 } 112 }
104 113
105 gfx::RectF GetTransformedBounds(aura::Window* window) { 114 gfx::RectF GetTransformedBounds(aura::Window* window) {
106 gfx::Transform transform; 115 gfx::Transform transform;
107 gfx::RectF bounds = window->bounds(); 116 gfx::RectF bounds = window->bounds();
108 transform.Translate(bounds.x(), bounds.y()); 117 transform.Translate(bounds.x(), bounds.y());
109 transform.PreconcatTransform(window->layer()->transform()); 118 transform.PreconcatTransform(window->layer()->transform());
110 transform.Translate(-bounds.x(), -bounds.y()); 119 transform.Translate(-bounds.x(), -bounds.y());
111 transform.TransformRect(&bounds); 120 transform.TransformRect(&bounds);
112 return bounds; 121 return bounds;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 ComputeTerminalStatesForAllWindows(); 185 ComputeTerminalStatesForAllWindows();
177 SetInitialWindowStates(); 186 SetInitialWindowStates();
178 } 187 }
179 188
180 virtual ~WindowOverviewModeImpl() { 189 virtual ~WindowOverviewModeImpl() {
181 container_->set_target_handler(container_->delegate()); 190 container_->set_target_handler(container_->delegate());
182 RemoveAnimationObserver(); 191 RemoveAnimationObserver();
183 aura::Window::Windows windows = window_list_provider_->GetWindowList(); 192 aura::Window::Windows windows = window_list_provider_->GetWindowList();
184 if (windows.empty()) 193 if (windows.empty())
185 return; 194 return;
186 std::for_each(windows.begin(), windows.end(), 195 std::for_each(windows.begin(), windows.end(), &RestoreWindowState);
187 std::bind2nd(std::ptr_fun(&RestoreWindowState),
188 split_view_controller_));
189 } 196 }
190 197
191 private: 198 private:
192 // Computes the transforms for all windows in both the topmost and bottom-most 199 // Computes the transforms for all windows in both the topmost and bottom-most
193 // positions. The transforms are set in the |kWindowOverviewState| property of 200 // positions. The transforms are set in the |kWindowOverviewState| property of
194 // the windows. 201 // the windows.
195 void ComputeTerminalStatesForAllWindows() { 202 void ComputeTerminalStatesForAllWindows() {
196 aura::Window::Windows windows = window_list_provider_->GetWindowList(); 203 aura::Window::Windows windows = window_list_provider_->GetWindowList();
197 size_t index = 0; 204 size_t index = 0;
198 205
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 dragged_window_->layer()->SetOpacity(1.f); 571 dragged_window_->layer()->SetOpacity(1.f);
565 dragged_window_ = NULL; 572 dragged_window_ = NULL;
566 } 573 }
567 574
568 void EndDragWindow(const ui::GestureEvent& gesture) { 575 void EndDragWindow(const ui::GestureEvent& gesture) {
569 CHECK(dragged_window_); 576 CHECK(dragged_window_);
570 CHECK(overview_toolbar_); 577 CHECK(overview_toolbar_);
571 OverviewToolbar::ActionType action = overview_toolbar_->current_action(); 578 OverviewToolbar::ActionType action = overview_toolbar_->current_action();
572 overview_toolbar_.reset(); 579 overview_toolbar_.reset();
573 if (action == OverviewToolbar::ACTION_TYPE_SPLIT) { 580 if (action == OverviewToolbar::ACTION_TYPE_SPLIT) {
574 delegate_->OnSplitViewMode(NULL, dragged_window_); 581 delegate_->OnSelectWindow(dragged_window_,
582 WindowOverviewModeDelegate::SPLIT_RIGHT);
575 return; 583 return;
576 } 584 }
577 585
578 // If the window is dropped on one of the left/right windows in split-mode, 586 // If the window is dropped on one of the left/right windows in split-mode,
579 // then switch that window. 587 // then switch that window.
580 aura::Window* split_drop = GetSplitWindowDropTarget(gesture); 588 aura::Window* split_drop = GetSplitWindowDropTarget(gesture);
581 if (split_drop) { 589 if (split_drop) {
582 aura::Window* left = split_view_controller_->left_window(); 590 WindowOverviewModeDelegate::SplitType split_type =
583 aura::Window* right = split_view_controller_->right_window(); 591 (split_view_controller_->left_window() == split_drop)
584 if (left == split_drop) 592 ? WindowOverviewModeDelegate::SPLIT_LEFT
585 left = dragged_window_; 593 : WindowOverviewModeDelegate::SPLIT_RIGHT;
586 else 594 delegate_->OnSelectWindow(dragged_window_, split_type);
587 right = dragged_window_;
588 delegate_->OnSplitViewMode(left, right);
589 return; 595 return;
590 } 596 }
591 597
592 if (ShouldCloseDragWindow(gesture)) 598 if (ShouldCloseDragWindow(gesture))
593 CloseDragWindow(gesture); 599 CloseDragWindow(gesture);
594 else 600 else
595 RestoreDragWindow(); 601 RestoreDragWindow();
596 } 602 }
597 603
598 void SelectWindow(aura::Window* window) { 604 void SelectWindow(aura::Window* window) {
599 if (!split_view_controller_->IsSplitViewModeActive()) { 605 WindowOverviewModeDelegate::SplitType split_type =
600 delegate_->OnSelectWindow(window); 606 WindowOverviewModeDelegate::SPLIT_NONE;
601 } else { 607 if (split_view_controller_->IsSplitViewModeActive()) {
602 // If the selected window is one of the left/right windows, then keep the 608 // Do not exit split view if the split view's left/right window was
603 // current state. 609 // selected.
604 if (window == split_view_controller_->left_window() || 610 if (window == split_view_controller_->left_window())
605 window == split_view_controller_->right_window()) { 611 split_type = WindowOverviewModeDelegate::SPLIT_LEFT;
606 delegate_->OnSplitViewMode(split_view_controller_->left_window(), 612 else if (window == split_view_controller_->right_window())
607 split_view_controller_->right_window()); 613 split_type = WindowOverviewModeDelegate::SPLIT_RIGHT;
608 } else {
609 delegate_->OnSelectWindow(window);
610 }
611 } 614 }
615 delegate_->OnSelectWindow(window, split_type);
616 }
617
618 // WindowOverviewMode:
619 virtual void SelectDefaultWindow() OVERRIDE {
620 // TODO(pkotwicz): Do not select a window which is about to be deleted.
621 aura::Window::Windows windows = window_list_provider_->GetWindowList();
622 SelectWindow(windows.empty() ? NULL : *windows.rbegin());
sadrul 2014/09/07 05:26:49 You can use windows.back() instead.
pkotwicz 2014/09/08 19:39:23 Done.
612 } 623 }
613 624
614 // ui::EventHandler: 625 // ui::EventHandler:
615 virtual void OnMouseEvent(ui::MouseEvent* mouse) OVERRIDE { 626 virtual void OnMouseEvent(ui::MouseEvent* mouse) OVERRIDE {
616 if (mouse->type() == ui::ET_MOUSE_PRESSED) { 627 if (mouse->type() == ui::ET_MOUSE_PRESSED) {
617 aura::Window* select = SelectWindowAt(mouse); 628 aura::Window* select = SelectWindowAt(mouse);
618 if (select) { 629 if (select) {
619 mouse->SetHandled(); 630 mouse->SetHandled();
620 SelectWindow(select); 631 SelectWindow(select);
621 } 632 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 aura::Window* container, 745 aura::Window* container,
735 const WindowListProvider* window_list_provider, 746 const WindowListProvider* window_list_provider,
736 SplitViewController* split_view_controller, 747 SplitViewController* split_view_controller,
737 WindowOverviewModeDelegate* delegate) { 748 WindowOverviewModeDelegate* delegate) {
738 return scoped_ptr<WindowOverviewMode>( 749 return scoped_ptr<WindowOverviewMode>(
739 new WindowOverviewModeImpl(container, window_list_provider, 750 new WindowOverviewModeImpl(container, window_list_provider,
740 split_view_controller, delegate)); 751 split_view_controller, delegate));
741 } 752 }
742 753
743 } // namespace athena 754 } // namespace athena
OLDNEW
« athena/wm/window_overview_mode.h ('K') | « athena/wm/window_overview_mode.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698