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

Side by Side Diff: ash/common/wm/overview/window_grid.cc

Issue 2141133002: [ash-md] Animates overview shield in and out (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: [ash-md] Completes shield opacity animation after overview closes (avoids crashes with delayed anim… Created 4 years, 5 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 "ash/common/wm/overview/window_grid.h" 5 #include "ash/common/wm/overview/window_grid.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 #include <set> 9 #include <set>
10 #include <utility> 10 #include <utility>
11 #include <vector> 11 #include <vector>
12 12
13 #include "ash/common/ash_switches.h" 13 #include "ash/common/ash_switches.h"
14 #include "ash/common/material_design/material_design_controller.h" 14 #include "ash/common/material_design/material_design_controller.h"
15 #include "ash/common/shelf/shelf_types.h"
16 #include "ash/common/shelf/wm_shelf.h"
15 #include "ash/common/shell_window_ids.h" 17 #include "ash/common/shell_window_ids.h"
16 #include "ash/common/wm/overview/scoped_overview_animation_settings.h" 18 #include "ash/common/wm/overview/scoped_overview_animation_settings.h"
17 #include "ash/common/wm/overview/scoped_overview_animation_settings_factory.h" 19 #include "ash/common/wm/overview/scoped_overview_animation_settings_factory.h"
18 #include "ash/common/wm/overview/scoped_transform_overview_window.h" 20 #include "ash/common/wm/overview/scoped_transform_overview_window.h"
19 #include "ash/common/wm/overview/window_selector.h" 21 #include "ash/common/wm/overview/window_selector.h"
22 #include "ash/common/wm/overview/window_selector_delegate.h"
20 #include "ash/common/wm/overview/window_selector_item.h" 23 #include "ash/common/wm/overview/window_selector_item.h"
21 #include "ash/common/wm/window_state.h" 24 #include "ash/common/wm/window_state.h"
22 #include "ash/common/wm/wm_screen_util.h" 25 #include "ash/common/wm/wm_screen_util.h"
23 #include "ash/common/wm_lookup.h" 26 #include "ash/common/wm_lookup.h"
24 #include "ash/common/wm_root_window_controller.h" 27 #include "ash/common/wm_root_window_controller.h"
25 #include "ash/common/wm_window.h" 28 #include "ash/common/wm_window.h"
26 #include "base/command_line.h" 29 #include "base/command_line.h"
27 #include "base/i18n/string_search.h" 30 #include "base/i18n/string_search.h"
28 #include "base/memory/scoped_vector.h" 31 #include "base/memory/scoped_vector.h"
29 #include "third_party/skia/include/core/SkColor.h" 32 #include "third_party/skia/include/core/SkColor.h"
(...skipping 12 matching lines...) Expand all
42 #include "ui/views/widget/widget.h" 45 #include "ui/views/widget/widget.h"
43 #include "ui/wm/core/window_animations.h" 46 #include "ui/wm/core/window_animations.h"
44 47
45 namespace ash { 48 namespace ash {
46 namespace { 49 namespace {
47 50
48 using Windows = std::vector<WmWindow*>; 51 using Windows = std::vector<WmWindow*>;
49 52
50 // An observer which holds onto the passed widget until the animation is 53 // An observer which holds onto the passed widget until the animation is
51 // complete. 54 // complete.
52 class CleanupWidgetAfterAnimationObserver 55 class CleanupWidgetAfterAnimationObserver
bruthig 2016/07/15 17:05:38 Although this is a pretty small class there certai
varkha 2016/07/15 18:53:36 Done. See if you like this better while I am putti
53 : public ui::ImplicitAnimationObserver { 56 : public ui::ImplicitAnimationObserver,
57 public DelayedAnimationObserver {
54 public: 58 public:
55 explicit CleanupWidgetAfterAnimationObserver( 59 explicit CleanupWidgetAfterAnimationObserver(
56 std::unique_ptr<views::Widget> widget); 60 std::unique_ptr<views::Widget> widget);
57 ~CleanupWidgetAfterAnimationObserver() override; 61 ~CleanupWidgetAfterAnimationObserver() override;
58 62
59 // ui::ImplicitAnimationObserver: 63 // ui::ImplicitAnimationObserver:
60 void OnImplicitAnimationsCompleted() override; 64 void OnImplicitAnimationsCompleted() override;
61 65
66 // DelayedAnimationObserver:
67 void SetDelegate(WindowSelectorDelegate* delegate) override;
68 void Shutdown() override;
69
62 private: 70 private:
63 std::unique_ptr<views::Widget> widget_; 71 std::unique_ptr<views::Widget> widget_;
72 WindowSelectorDelegate* delegate_;
64 73
65 DISALLOW_COPY_AND_ASSIGN(CleanupWidgetAfterAnimationObserver); 74 DISALLOW_COPY_AND_ASSIGN(CleanupWidgetAfterAnimationObserver);
66 }; 75 };
67 76
68 CleanupWidgetAfterAnimationObserver::CleanupWidgetAfterAnimationObserver( 77 CleanupWidgetAfterAnimationObserver::CleanupWidgetAfterAnimationObserver(
69 std::unique_ptr<views::Widget> widget) 78 std::unique_ptr<views::Widget> widget)
70 : widget_(std::move(widget)) {} 79 : widget_(std::move(widget)), delegate_(nullptr) {}
71 80
72 CleanupWidgetAfterAnimationObserver::~CleanupWidgetAfterAnimationObserver() {} 81 CleanupWidgetAfterAnimationObserver::~CleanupWidgetAfterAnimationObserver() {}
73 82
74 void CleanupWidgetAfterAnimationObserver::OnImplicitAnimationsCompleted() { 83 void CleanupWidgetAfterAnimationObserver::OnImplicitAnimationsCompleted() {
bruthig 2016/07/15 17:05:38 I was looking in to whether or not OnImplicitAnima
varkha 2016/07/15 18:53:36 Animations here are non-zero duration so this is p
84 if (!widget_)
bruthig 2016/07/15 17:05:38 Is it accurate that this check will only be true d
varkha 2016/07/15 18:53:36 Done.
85 return;
86 if (delegate_) {
87 delegate_->RemoveDelayedAnimationObserver(this);
88 return;
89 }
75 delete this; 90 delete this;
76 } 91 }
77 92
93 void CleanupWidgetAfterAnimationObserver::SetDelegate(
94 WindowSelectorDelegate* delegate) {
95 delegate_ = delegate;
96 }
97
98 void CleanupWidgetAfterAnimationObserver::Shutdown() {
99 widget_.reset();
100 delegate_ = nullptr;
101 }
102
78 // A comparator for locating a given target window. 103 // A comparator for locating a given target window.
79 struct WindowSelectorItemComparator { 104 struct WindowSelectorItemComparator {
80 explicit WindowSelectorItemComparator(const WmWindow* target_window) 105 explicit WindowSelectorItemComparator(const WmWindow* target_window)
81 : target(target_window) {} 106 : target(target_window) {}
82 107
83 bool operator()(WindowSelectorItem* window) const { 108 bool operator()(WindowSelectorItem* window) const {
84 return window->GetWindow() == target; 109 return window->GetWindow() == target;
85 } 110 }
86 111
87 const WmWindow* target; 112 const WmWindow* target;
88 }; 113 };
89 114
90 // Conceptually the window overview is a table or grid of cells having this 115 // Conceptually the window overview is a table or grid of cells having this
91 // fixed aspect ratio. The number of columns is determined by maximizing the 116 // fixed aspect ratio. The number of columns is determined by maximizing the
92 // area of them based on the number of window_list. 117 // area of them based on the number of window_list.
93 const float kCardAspectRatio = 4.0f / 3.0f; 118 const float kCardAspectRatio = 4.0f / 3.0f;
94 119
95 // The minimum number of cards along the major axis (i.e. horizontally on a 120 // The minimum number of cards along the major axis (i.e. horizontally on a
96 // landscape orientation). 121 // landscape orientation).
97 const int kMinCardsMajor = 3; 122 const int kMinCardsMajor = 3;
98 123
99 const int kOverviewSelectorTransitionMilliseconds = 250; 124 const int kOverviewSelectorTransitionMilliseconds = 250;
100 125
101 // The color and opacity of the screen shield in overview. 126 // The color and opacity of the screen shield in overview.
102 const SkColor kShieldColor = SkColorSetARGB(178, 0, 0, 0); 127 const SkColor kShieldColor = SkColorSetARGB(255, 0, 0, 0);
128 const float kShieldOpacity = 0.7f;
103 129
104 // The color and opacity of the overview selector. 130 // The color and opacity of the overview selector.
105 const SkColor kWindowSelectionColor = SkColorSetARGB(128, 0, 0, 0); 131 const SkColor kWindowSelectionColor = SkColorSetARGB(128, 0, 0, 0);
106 const SkColor kWindowSelectionColorMD = SkColorSetARGB(51, 255, 255, 255); 132 const SkColor kWindowSelectionColorMD = SkColorSetARGB(51, 255, 255, 255);
107 const SkColor kWindowSelectionBorderColor = SkColorSetARGB(38, 255, 255, 255); 133 const SkColor kWindowSelectionBorderColor = SkColorSetARGB(38, 255, 255, 255);
108 const SkColor kWindowSelectionBorderColorMD = SkColorSetARGB(76, 255, 255, 255); 134 const SkColor kWindowSelectionBorderColorMD = SkColorSetARGB(76, 255, 255, 255);
109 135
110 // Border thickness of overview selector. 136 // Border thickness of overview selector.
111 const int kWindowSelectionBorderThickness = 2; 137 const int kWindowSelectionBorderThickness = 2;
112 const int kWindowSelectionBorderThicknessMD = 1; 138 const int kWindowSelectionBorderThicknessMD = 1;
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 } 372 }
347 if (swap_index > i) 373 if (swap_index > i)
348 std::swap((*items)[i], (*items)[swap_index]); 374 std::swap((*items)[i], (*items)[swap_index]);
349 } 375 }
350 } 376 }
351 377
352 // Creates and returns a background translucent widget parented in 378 // Creates and returns a background translucent widget parented in
353 // |root_window|'s default container and having |background_color|. 379 // |root_window|'s default container and having |background_color|.
354 // When |border_thickness| is non-zero, a border is created having 380 // When |border_thickness| is non-zero, a border is created having
355 // |border_color|, otherwise |border_color| parameter is ignored. 381 // |border_color|, otherwise |border_color| parameter is ignored.
382 // The new background widget starts with |initial_opacity| and then fades in.
356 views::Widget* CreateBackgroundWidget(WmWindow* root_window, 383 views::Widget* CreateBackgroundWidget(WmWindow* root_window,
357 SkColor background_color, 384 SkColor background_color,
358 int border_thickness, 385 int border_thickness,
359 int border_radius, 386 int border_radius,
360 SkColor border_color) { 387 SkColor border_color,
388 float initial_opacity) {
361 views::Widget* widget = new views::Widget; 389 views::Widget* widget = new views::Widget;
362 views::Widget::InitParams params; 390 views::Widget::InitParams params;
363 params.type = views::Widget::InitParams::TYPE_POPUP; 391 params.type = views::Widget::InitParams::TYPE_POPUP;
364 params.keep_on_top = false; 392 params.keep_on_top = false;
365 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 393 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
366 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 394 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
367 params.accept_events = false; 395 params.accept_events = false;
368 widget->set_focus_on_creation(false); 396 widget->set_focus_on_creation(false);
369 // Parenting in kShellWindowId_DesktopBackgroundContainer allows proper 397 // Parenting in kShellWindowId_DesktopBackgroundContainer allows proper
370 // layering of the shield and selection widgets. Since that container is 398 // layering of the shield and selection widgets. Since that container is
(...skipping 17 matching lines...) Expand all
388 content_view->set_background( 416 content_view->set_background(
389 views::Background::CreateSolidBackground(background_color)); 417 views::Background::CreateSolidBackground(background_color));
390 if (border_thickness) { 418 if (border_thickness) {
391 content_view->SetBorder( 419 content_view->SetBorder(
392 views::Border::CreateSolidBorder(border_thickness, border_color)); 420 views::Border::CreateSolidBorder(border_thickness, border_color));
393 } 421 }
394 } 422 }
395 widget->SetContentsView(content_view); 423 widget->SetContentsView(content_view);
396 widget_window->GetParent()->StackChildAtTop(widget_window); 424 widget_window->GetParent()->StackChildAtTop(widget_window);
397 widget->Show(); 425 widget->Show();
398 // New background widget starts with 0 opacity and then fades in. 426 widget_window->SetOpacity(initial_opacity);
399 widget_window->SetOpacity(0.f);
400 return widget; 427 return widget;
401 } 428 }
402 429
403 } // namespace 430 } // namespace
404 431
405 WindowGrid::WindowGrid(WmWindow* root_window, 432 WindowGrid::WindowGrid(WmWindow* root_window,
406 const std::vector<WmWindow*>& windows, 433 const std::vector<WmWindow*>& windows,
407 WindowSelector* window_selector) 434 WindowSelector* window_selector)
408 : root_window_(root_window), 435 : root_window_(root_window),
409 window_selector_(window_selector), 436 window_selector_(window_selector),
(...skipping 18 matching lines...) Expand all
428 observed_windows_.insert(window); 455 observed_windows_.insert(window);
429 window_list_.push_back(new WindowSelectorItem(window, window_selector_)); 456 window_list_.push_back(new WindowSelectorItem(window, window_selector_));
430 } 457 }
431 } 458 }
432 459
433 WindowGrid::~WindowGrid() { 460 WindowGrid::~WindowGrid() {
434 for (WmWindow* window : observed_windows_) 461 for (WmWindow* window : observed_windows_)
435 window->RemoveObserver(this); 462 window->RemoveObserver(this);
436 } 463 }
437 464
465 void WindowGrid::Shutdown() {
466 if (shield_widget_) {
467 // Fade out the shield widget. This animation continues past the lifetime
468 // of |this|.
469 WmWindow* widget_window =
470 WmLookup::Get()->GetWindowForWidget(shield_widget_.get());
471 ui::ScopedLayerAnimationSettings animation_settings(
472 widget_window->GetLayer()->GetAnimator());
473 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(
474 kOverviewSelectorTransitionMilliseconds));
475 animation_settings.SetTweenType(gfx::Tween::EASE_IN);
476 animation_settings.SetPreemptionStrategy(
477 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
478 // CleanupWidgetAfterAnimationObserver will delete itself (and the shield
479 // widget) when the opacity animation is complete.
480 // Ownership over the observer is passed to the window_selector_->delegate()
481 // which has longer lifetime so that animations can continue even after the
482 // overview mode is shut down.
483 views::Widget* shield_widget = shield_widget_.get();
484 std::unique_ptr<CleanupWidgetAfterAnimationObserver> observer(
485 new CleanupWidgetAfterAnimationObserver(std::move(shield_widget_)));
486 animation_settings.AddObserver(observer.get());
487 window_selector_->delegate()->AddDelayedAnimationObserver(
488 std::move(observer));
489 shield_widget->SetOpacity(0.f);
490 }
491 }
492
438 void WindowGrid::PrepareForOverview() { 493 void WindowGrid::PrepareForOverview() {
439 if (ash::MaterialDesignController::IsOverviewMaterial()) 494 if (ash::MaterialDesignController::IsOverviewMaterial())
440 InitShieldWidget(); 495 InitShieldWidget();
441 for (auto iter = window_list_.begin(); iter != window_list_.end(); ++iter) 496 for (auto iter = window_list_.begin(); iter != window_list_.end(); ++iter)
442 (*iter)->PrepareForOverview(); 497 (*iter)->PrepareForOverview();
443 } 498 }
444 499
445 void WindowGrid::PositionWindowsMD(bool animate) { 500 void WindowGrid::PositionWindowsMD(bool animate) {
446 if (window_list_.empty()) 501 if (window_list_.empty())
447 return; 502 return;
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 840
786 if (ash::MaterialDesignController::IsOverviewMaterial()) { 841 if (ash::MaterialDesignController::IsOverviewMaterial()) {
787 PositionWindows(false); 842 PositionWindows(false);
788 return; 843 return;
789 } 844 }
790 // Recompute the transform for the window. 845 // Recompute the transform for the window.
791 (*iter)->RecomputeWindowTransforms(); 846 (*iter)->RecomputeWindowTransforms();
792 } 847 }
793 848
794 void WindowGrid::InitShieldWidget() { 849 void WindowGrid::InitShieldWidget() {
795 shield_widget_.reset(CreateBackgroundWidget(root_window_, kShieldColor, 0, 0, 850 // TODO(varkha): The code assumes that SHELF_BACKGROUND_MAXIMIZED is
796 SK_ColorTRANSPARENT)); 851 // synonymous with a black shelf background. Update this code if that
852 // assumption is no longer valid.
853 const float initial_opacity =
854 (root_window_->GetRootWindowController()
855 ->GetShelf()
856 ->GetBackgroundType() == SHELF_BACKGROUND_MAXIMIZED)
857 ? 1.f
858 : 0.f;
859 shield_widget_.reset(CreateBackgroundWidget(
860 root_window_, kShieldColor, 0, 0, SK_ColorTRANSPARENT, initial_opacity));
797 861
798 WmWindow* widget_window = 862 WmWindow* widget_window =
799 WmLookup::Get()->GetWindowForWidget(shield_widget_.get()); 863 WmLookup::Get()->GetWindowForWidget(shield_widget_.get());
800 const gfx::Rect bounds = widget_window->GetParent()->GetBounds(); 864 const gfx::Rect bounds = widget_window->GetParent()->GetBounds();
801 widget_window->SetBounds(bounds); 865 widget_window->SetBounds(bounds);
802 866
803 ui::ScopedLayerAnimationSettings animation_settings( 867 ui::ScopedLayerAnimationSettings animation_settings(
804 widget_window->GetLayer()->GetAnimator()); 868 widget_window->GetLayer()->GetAnimator());
805 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds( 869 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(
806 kOverviewSelectorTransitionMilliseconds)); 870 kOverviewSelectorTransitionMilliseconds));
807 animation_settings.SetTweenType(gfx::Tween::LINEAR_OUT_SLOW_IN); 871 animation_settings.SetTweenType(gfx::Tween::LINEAR_OUT_SLOW_IN);
808 animation_settings.SetPreemptionStrategy( 872 animation_settings.SetPreemptionStrategy(
809 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 873 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
810 shield_widget_->SetOpacity(1.f); 874 shield_widget_->SetOpacity(kShieldOpacity);
811 } 875 }
812 876
813 void WindowGrid::InitSelectionWidget(WindowSelector::Direction direction) { 877 void WindowGrid::InitSelectionWidget(WindowSelector::Direction direction) {
814 const bool material = ash::MaterialDesignController::IsOverviewMaterial(); 878 const bool material = ash::MaterialDesignController::IsOverviewMaterial();
815 const int border_thickness = material ? kWindowSelectionBorderThicknessMD 879 const int border_thickness = material ? kWindowSelectionBorderThicknessMD
816 : kWindowSelectionBorderThickness; 880 : kWindowSelectionBorderThickness;
817 const int border_color = 881 const int border_color =
818 material ? kWindowSelectionBorderColorMD : kWindowSelectionBorderColor; 882 material ? kWindowSelectionBorderColorMD : kWindowSelectionBorderColor;
819 const int selection_color = 883 const int selection_color =
820 material ? kWindowSelectionColorMD : kWindowSelectionColor; 884 material ? kWindowSelectionColorMD : kWindowSelectionColor;
821 const int border_radius = 885 const int border_radius =
822 material ? kWindowSelectionRadiusMD : kWindowSelectionRadius; 886 material ? kWindowSelectionRadiusMD : kWindowSelectionRadius;
823 selection_widget_.reset(CreateBackgroundWidget(root_window_, selection_color, 887 selection_widget_.reset(
824 border_thickness, 888 CreateBackgroundWidget(root_window_, selection_color, border_thickness,
825 border_radius, border_color)); 889 border_radius, border_color, 0.f));
826 890
827 WmWindow* widget_window = 891 WmWindow* widget_window =
828 WmLookup::Get()->GetWindowForWidget(selection_widget_.get()); 892 WmLookup::Get()->GetWindowForWidget(selection_widget_.get());
829 const gfx::Rect target_bounds = 893 const gfx::Rect target_bounds =
830 root_window_->ConvertRectFromScreen(SelectedWindow()->target_bounds()); 894 root_window_->ConvertRectFromScreen(SelectedWindow()->target_bounds());
831 gfx::Vector2d fade_out_direction = 895 gfx::Vector2d fade_out_direction =
832 GetSlideVectorForFadeIn(direction, target_bounds); 896 GetSlideVectorForFadeIn(direction, target_bounds);
833 widget_window->SetBounds(target_bounds - fade_out_direction); 897 widget_window->SetBounds(target_bounds - fade_out_direction);
834 } 898 }
835 899
(...skipping 11 matching lines...) Expand all
847 gfx::Vector2d fade_out_direction = 911 gfx::Vector2d fade_out_direction =
848 GetSlideVectorForFadeIn(direction, old_selection_window->GetBounds()); 912 GetSlideVectorForFadeIn(direction, old_selection_window->GetBounds());
849 913
850 ui::ScopedLayerAnimationSettings animation_settings( 914 ui::ScopedLayerAnimationSettings animation_settings(
851 old_selection_window->GetLayer()->GetAnimator()); 915 old_selection_window->GetLayer()->GetAnimator());
852 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds( 916 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(
853 kOverviewSelectorTransitionMilliseconds)); 917 kOverviewSelectorTransitionMilliseconds));
854 animation_settings.SetPreemptionStrategy( 918 animation_settings.SetPreemptionStrategy(
855 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 919 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
856 animation_settings.SetTweenType(gfx::Tween::FAST_OUT_LINEAR_IN); 920 animation_settings.SetTweenType(gfx::Tween::FAST_OUT_LINEAR_IN);
857 // CleanupWidgetAfterAnimationObserver will delete itself (and the 921 // CleanupWidgetAfterAnimationObserver will delete itself (and the widget)
858 // widget) when the movement animation is complete. 922 // when the motion animation is complete.
859 animation_settings.AddObserver( 923 // Ownership over the observer is passed to the window_selector_->delegate()
924 // which has longer lifetime so that animations can continue even after the
925 // overview mode is shut down.
926 std::unique_ptr<CleanupWidgetAfterAnimationObserver> observer(
860 new CleanupWidgetAfterAnimationObserver(std::move(selection_widget_))); 927 new CleanupWidgetAfterAnimationObserver(std::move(selection_widget_)));
928 animation_settings.AddObserver(observer.get());
929 window_selector_->delegate()->AddDelayedAnimationObserver(
930 std::move(observer));
861 old_selection->SetOpacity(0.f); 931 old_selection->SetOpacity(0.f);
862 old_selection_window->SetBounds(old_selection_window->GetBounds() + 932 old_selection_window->SetBounds(old_selection_window->GetBounds() +
863 fade_out_direction); 933 fade_out_direction);
864 old_selection->Hide(); 934 old_selection->Hide();
865 } 935 }
866 if (out_of_bounds) 936 if (out_of_bounds)
867 return; 937 return;
868 938
869 if (!selection_widget_) 939 if (!selection_widget_)
870 InitSelectionWidget(direction); 940 InitSelectionWidget(direction);
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 *min_right = left; 1031 *min_right = left;
962 if (*max_right < left) 1032 if (*max_right < left)
963 *max_right = left; 1033 *max_right = left;
964 } 1034 }
965 *max_bottom = top + height; 1035 *max_bottom = top + height;
966 } 1036 }
967 return windows_fit; 1037 return windows_fit;
968 } 1038 }
969 1039
970 } // namespace ash 1040 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698