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

Side by Side Diff: ash/wm/dock/docked_window_layout_manager.cc

Issue 98373006: Animating docked background in sync with shelf (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Animating docked background in sync with shelf (rebase) Created 7 years 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
« no previous file with comments | « ash/wm/dock/docked_window_layout_manager.h ('k') | ash/wm/workspace_controller.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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/dock/docked_window_layout_manager.h" 5 #include "ash/wm/dock/docked_window_layout_manager.h"
6 6
7 #include "ash/ash_switches.h" 7 #include "ash/ash_switches.h"
8 #include "ash/launcher/launcher.h" 8 #include "ash/launcher/launcher.h"
9 #include "ash/screen_ash.h" 9 #include "ash/screen_ash.h"
10 #include "ash/shelf/shelf_layout_manager.h" 10 #include "ash/shelf/shelf_layout_manager.h"
11 #include "ash/shelf/shelf_types.h" 11 #include "ash/shelf/shelf_types.h"
12 #include "ash/shelf/shelf_widget.h" 12 #include "ash/shelf/shelf_widget.h"
13 #include "ash/shell.h" 13 #include "ash/shell.h"
14 #include "ash/shell_window_ids.h" 14 #include "ash/shell_window_ids.h"
15 #include "ash/wm/coordinate_conversion.h" 15 #include "ash/wm/coordinate_conversion.h"
16 #include "ash/wm/window_animations.h" 16 #include "ash/wm/window_animations.h"
17 #include "ash/wm/window_properties.h" 17 #include "ash/wm/window_properties.h"
18 #include "ash/wm/window_state.h" 18 #include "ash/wm/window_state.h"
19 #include "ash/wm/window_util.h" 19 #include "ash/wm/window_util.h"
20 #include "ash/wm/workspace_controller.h" 20 #include "ash/wm/workspace_controller.h"
21 #include "base/auto_reset.h" 21 #include "base/auto_reset.h"
22 #include "base/command_line.h" 22 #include "base/command_line.h"
23 #include "base/metrics/histogram.h" 23 #include "base/metrics/histogram.h"
24 #include "grit/ash_resources.h"
24 #include "third_party/skia/include/core/SkColor.h" 25 #include "third_party/skia/include/core/SkColor.h"
26 #include "third_party/skia/include/core/SkPaint.h"
25 #include "ui/aura/client/activation_client.h" 27 #include "ui/aura/client/activation_client.h"
26 #include "ui/aura/client/focus_client.h" 28 #include "ui/aura/client/focus_client.h"
27 #include "ui/aura/client/window_tree_client.h" 29 #include "ui/aura/client/window_tree_client.h"
28 #include "ui/aura/root_window.h" 30 #include "ui/aura/root_window.h"
29 #include "ui/aura/window.h" 31 #include "ui/aura/window.h"
30 #include "ui/aura/window_delegate.h" 32 #include "ui/aura/window_delegate.h"
33 #include "ui/base/resource/resource_bundle.h"
31 #include "ui/compositor/scoped_layer_animation_settings.h" 34 #include "ui/compositor/scoped_layer_animation_settings.h"
35 #include "ui/gfx/canvas.h"
36 #include "ui/gfx/image/image_skia_operations.h"
32 #include "ui/gfx/rect.h" 37 #include "ui/gfx/rect.h"
33 38
34 namespace ash { 39 namespace ash {
35 namespace internal { 40 namespace internal {
36 41
37 // Minimum, maximum width of the dock area and a width of the gap 42 // Minimum, maximum width of the dock area and a width of the gap
38 // static 43 // static
39 const int DockedWindowLayoutManager::kMaxDockWidth = 360; 44 const int DockedWindowLayoutManager::kMaxDockWidth = 360;
40 // static 45 // static
41 const int DockedWindowLayoutManager::kMinDockWidth = 200; 46 const int DockedWindowLayoutManager::kMinDockWidth = 200;
42 // static 47 // static
43 const int DockedWindowLayoutManager::kMinDockGap = 2; 48 const int DockedWindowLayoutManager::kMinDockGap = 2;
44 // static 49 // static
45 const int DockedWindowLayoutManager::kIdealWidth = 250; 50 const int DockedWindowLayoutManager::kIdealWidth = 250;
46 const int kMinimumHeight = 250; 51 const int kMinimumHeight = 250;
47 const int kSlideDurationMs = 120; 52 const int kSlideDurationMs = 120;
48 const int kFadeDurationMs = 60; 53 const int kFadeDurationMs = 60;
49 const int kMinimizeDurationMs = 720; 54 const int kMinimizeDurationMs = 720;
50 55
51 namespace { 56 class DockedBackgroundWidget : public views::Widget,
57 public internal::BackgroundAnimatorDelegate {
58 public:
59 explicit DockedBackgroundWidget(aura::Window* container)
60 : alignment_(DOCKED_ALIGNMENT_NONE),
61 background_animator_(this, 0, kLauncherBackgroundAlpha),
62 alpha_(0),
63 opaque_background_(ui::LAYER_SOLID_COLOR) {
64 InitWidget(container);
65 }
52 66
53 const SkColor kDockBackgroundColor = SkColorSetARGB(0xff, 0x10, 0x10, 0x10); 67 // Sets widget bounds and sizes opaque background layer to fill the widget.
54 const float kDockBackgroundOpacity = 0.5f; 68 void SetBackgroundBounds(const gfx::Rect bounds, DockedAlignment alignment) {
69 SetBounds(bounds);
70 opaque_background_.SetBounds(gfx::Rect(bounds.size()));
71 alignment_ = alignment;
72 }
55 73
56 class DockedBackgroundWidget : public views::Widget { 74 // Sets the docked area background type and starts transition animation.
57 public: 75 void SetPaintsBackground(
58 explicit DockedBackgroundWidget(aura::Window* container) { 76 ShelfBackgroundType background_type,
59 InitWidget(container); 77 BackgroundAnimatorChangeType change_type) {
78 float target_opacity =
79 (background_type == SHELF_BACKGROUND_MAXIMIZED) ? 1.0f : 0.0f;
80 scoped_ptr<ui::ScopedLayerAnimationSettings> opaque_background_animation;
81 if (change_type != BACKGROUND_CHANGE_IMMEDIATE) {
82 opaque_background_animation.reset(new ui::ScopedLayerAnimationSettings(
83 opaque_background_.GetAnimator()));
84 opaque_background_animation->SetTransitionDuration(
85 base::TimeDelta::FromMilliseconds(kTimeToSwitchBackgroundMs));
86 }
87 opaque_background_.SetOpacity(target_opacity);
88
89 // TODO(varkha): use ui::Layer on both opaque_background and normal
90 // background retire background_animator_ at all. It would be simpler.
91 // See also ShelfWidget::SetPaintsBackground.
92 background_animator_.SetPaintsBackground(
93 background_type != SHELF_BACKGROUND_DEFAULT,
94 change_type);
95 SchedulePaintInRect(gfx::Rect(GetWindowBoundsInScreen().size()));
96 }
97
98 // views::Widget:
99 virtual void OnNativeWidgetPaint(gfx::Canvas* canvas) OVERRIDE {
100 const gfx::ImageSkia& launcher_background(
101 alignment_ == DOCKED_ALIGNMENT_LEFT ?
102 launcher_background_left_ : launcher_background_right_);
103 gfx::Rect rect = gfx::Rect(GetWindowBoundsInScreen().size());
104 SkPaint paint;
105 paint.setAlpha(alpha_);
106 canvas->DrawImageInt(
107 launcher_background,
108 0, 0, launcher_background.width(), launcher_background.height(),
109 alignment_ == DOCKED_ALIGNMENT_LEFT ?
110 rect.width() - launcher_background.width() : 0, 0,
111 launcher_background.width(), rect.height(),
112 false,
113 paint);
114 canvas->DrawImageInt(
115 launcher_background,
116 alignment_ == DOCKED_ALIGNMENT_LEFT ?
117 0 : launcher_background.width() - 1, 0,
118 1, launcher_background.height(),
119 alignment_ == DOCKED_ALIGNMENT_LEFT ?
120 0 : launcher_background.width(), 0,
121 rect.width() - launcher_background.width(), rect.height(),
122 false,
123 paint);
124 }
125
126 // BackgroundAnimatorDelegate:
127 virtual void UpdateBackground(int alpha) OVERRIDE {
128 alpha_ = alpha;
129 SchedulePaintInRect(gfx::Rect(GetWindowBoundsInScreen().size()));
60 } 130 }
61 131
62 private: 132 private:
63 void InitWidget(aura::Window* parent) { 133 void InitWidget(aura::Window* parent) {
64 views::Widget::InitParams params; 134 views::Widget::InitParams params;
65 params.type = views::Widget::InitParams::TYPE_POPUP; 135 params.type = views::Widget::InitParams::TYPE_POPUP;
66 params.opacity = views::Widget::InitParams::OPAQUE_WINDOW; 136 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
67 params.can_activate = false; 137 params.can_activate = false;
68 params.keep_on_top = false; 138 params.keep_on_top = false;
69 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 139 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
70 params.parent = parent; 140 params.parent = parent;
71 params.accept_events = false; 141 params.accept_events = false;
72 set_focus_on_creation(false); 142 set_focus_on_creation(false);
73 Init(params); 143 Init(params);
74 GetNativeWindow()->SetProperty(internal::kStayInSameRootWindowKey, true); 144 GetNativeWindow()->SetProperty(internal::kStayInSameRootWindowKey, true);
75 DCHECK_EQ(GetNativeView()->GetRootWindow(), parent->GetRootWindow()); 145 opaque_background_.SetColor(SK_ColorBLACK);
76 views::View* content_view = new views::View; 146 opaque_background_.SetBounds(gfx::Rect(GetWindowBoundsInScreen().size()));
77 content_view->set_background( 147 opaque_background_.SetOpacity(0.0f);
78 views::Background::CreateSolidBackground(kDockBackgroundColor)); 148 GetNativeWindow()->layer()->Add(&opaque_background_);
79 SetContentsView(content_view);
80 Hide(); 149 Hide();
150
151 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
152 gfx::ImageSkia launcher_background =
153 *rb.GetImageSkiaNamed(IDR_AURA_LAUNCHER_BACKGROUND);
154 launcher_background_left_ = gfx::ImageSkiaOperations::CreateRotatedImage(
155 launcher_background, SkBitmapOperations::ROTATION_90_CW);
156 launcher_background_right_ = gfx::ImageSkiaOperations::CreateRotatedImage(
157 launcher_background, SkBitmapOperations::ROTATION_270_CW);
81 } 158 }
82 159
160 DockedAlignment alignment_;
161
162 // The animator for the background transitions.
163 internal::BackgroundAnimator background_animator_;
164
165 // The alpha to use for drawing image assets covering the docked background.
166 int alpha_;
167
168 // Solid black background that can be made fully opaque.
169 ui::Layer opaque_background_;
170
171 // Backgrounds created from shelf background by 90 or 270 degree rotation.
172 gfx::ImageSkia launcher_background_left_;
173 gfx::ImageSkia launcher_background_right_;
174
83 DISALLOW_COPY_AND_ASSIGN(DockedBackgroundWidget); 175 DISALLOW_COPY_AND_ASSIGN(DockedBackgroundWidget);
84 }; 176 };
85 177
178 namespace {
179
86 // Returns true if a window is a popup or a transient child. 180 // Returns true if a window is a popup or a transient child.
87 bool IsPopupOrTransient(const aura::Window* window) { 181 bool IsPopupOrTransient(const aura::Window* window) {
88 return (window->type() == aura::client::WINDOW_TYPE_POPUP || 182 return (window->type() == aura::client::WINDOW_TYPE_POPUP ||
89 window->transient_parent()); 183 window->transient_parent());
90 } 184 }
91 185
92 // Certain windows (minimized, hidden or popups) do not matter to docking. 186 // Certain windows (minimized, hidden or popups) do not matter to docking.
93 bool IsUsedByLayout(const aura::Window* window) { 187 bool IsUsedByLayout(const aura::Window* window) {
94 return (window->IsVisible() && 188 return (window->IsVisible() &&
95 !wm::GetWindowState(window)->IsMinimized() && 189 !wm::GetWindowState(window)->IsMinimized() &&
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 } 312 }
219 313
220 private: 314 private:
221 aura::Window* dragged_window_; 315 aura::Window* dragged_window_;
222 float delta_; 316 float delta_;
223 }; 317 };
224 318
225 } // namespace 319 } // namespace
226 320
227 //////////////////////////////////////////////////////////////////////////////// 321 ////////////////////////////////////////////////////////////////////////////////
228 // DockLayoutManager public implementation: 322 // DockedWindowLayoutManager public implementation:
229 DockedWindowLayoutManager::DockedWindowLayoutManager( 323 DockedWindowLayoutManager::DockedWindowLayoutManager(
230 aura::Window* dock_container, WorkspaceController* workspace_controller) 324 aura::Window* dock_container, WorkspaceController* workspace_controller)
231 : dock_container_(dock_container), 325 : dock_container_(dock_container),
232 in_layout_(false), 326 in_layout_(false),
233 dragged_window_(NULL), 327 dragged_window_(NULL),
234 is_dragged_window_docked_(false), 328 is_dragged_window_docked_(false),
235 is_dragged_from_dock_(false), 329 is_dragged_from_dock_(false),
236 launcher_(NULL), 330 launcher_(NULL),
237 workspace_controller_(workspace_controller), 331 workspace_controller_(workspace_controller),
238 in_fullscreen_(workspace_controller_->GetWindowState() == 332 in_fullscreen_(workspace_controller_->GetWindowState() ==
239 WORKSPACE_WINDOW_STATE_FULL_SCREEN), 333 WORKSPACE_WINDOW_STATE_FULL_SCREEN),
240 docked_width_(0), 334 docked_width_(0),
241 alignment_(DOCKED_ALIGNMENT_NONE), 335 alignment_(DOCKED_ALIGNMENT_NONE),
242 last_active_window_(NULL), 336 last_active_window_(NULL),
243 last_action_time_(base::Time::Now()), 337 last_action_time_(base::Time::Now()),
244 background_widget_(new DockedBackgroundWidget(dock_container_)) { 338 background_widget_(new DockedBackgroundWidget(dock_container_)) {
245 DCHECK(dock_container); 339 DCHECK(dock_container);
246 aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())-> 340 aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())->
247 AddObserver(this); 341 AddObserver(this);
248 Shell::GetInstance()->AddShellObserver(this); 342 Shell::GetInstance()->AddShellObserver(this);
249 } 343 }
250 344
251 DockedWindowLayoutManager::~DockedWindowLayoutManager() { 345 DockedWindowLayoutManager::~DockedWindowLayoutManager() {
252 Shutdown(); 346 Shutdown();
253 } 347 }
254 348
255 void DockedWindowLayoutManager::Shutdown() { 349 void DockedWindowLayoutManager::Shutdown() {
350 if (launcher_ && launcher_->shelf_widget()) {
351 ShelfLayoutManager* shelf_layout_manager = ShelfLayoutManager::ForLauncher(
352 launcher_->shelf_widget()->GetNativeWindow());
353 shelf_layout_manager->RemoveObserver(this);
354 }
256 launcher_ = NULL; 355 launcher_ = NULL;
257 for (size_t i = 0; i < dock_container_->children().size(); ++i) { 356 for (size_t i = 0; i < dock_container_->children().size(); ++i) {
258 aura::Window* child = dock_container_->children()[i]; 357 aura::Window* child = dock_container_->children()[i];
259 child->RemoveObserver(this); 358 child->RemoveObserver(this);
260 wm::GetWindowState(child)->RemoveObserver(this); 359 wm::GetWindowState(child)->RemoveObserver(this);
261 } 360 }
262 aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())-> 361 aura::client::GetActivationClient(Shell::GetPrimaryRootWindow())->
263 RemoveObserver(this); 362 RemoveObserver(this);
264 Shell::GetInstance()->RemoveShellObserver(this); 363 Shell::GetInstance()->RemoveShellObserver(this);
265 } 364 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 dragged_window_ = NULL; 425 dragged_window_ = NULL;
327 dragged_bounds_ = gfx::Rect(); 426 dragged_bounds_ = gfx::Rect();
328 Relayout(); 427 Relayout();
329 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED); 428 UpdateDockBounds(DockedWindowLayoutManagerObserver::CHILD_CHANGED);
330 RecordUmaAction(action, source); 429 RecordUmaAction(action, source);
331 } 430 }
332 431
333 void DockedWindowLayoutManager::SetLauncher(ash::Launcher* launcher) { 432 void DockedWindowLayoutManager::SetLauncher(ash::Launcher* launcher) {
334 DCHECK(!launcher_); 433 DCHECK(!launcher_);
335 launcher_ = launcher; 434 launcher_ = launcher;
435 if (launcher_->shelf_widget()) {
436 ShelfLayoutManager* shelf_layout_manager = ShelfLayoutManager::ForLauncher(
437 launcher_->shelf_widget()->GetNativeWindow());
438 shelf_layout_manager->AddObserver(this);
439 }
336 } 440 }
337 441
338 DockedAlignment DockedWindowLayoutManager::GetAlignmentOfWindow( 442 DockedAlignment DockedWindowLayoutManager::GetAlignmentOfWindow(
339 const aura::Window* window) const { 443 const aura::Window* window) const {
340 const gfx::Rect& bounds(window->GetBoundsInScreen()); 444 const gfx::Rect& bounds(window->GetBoundsInScreen());
341 445
342 // Test overlap with an existing docked area first. 446 // Test overlap with an existing docked area first.
343 if (docked_bounds_.Intersects(bounds) && 447 if (docked_bounds_.Intersects(bounds) &&
344 alignment_ != DOCKED_ALIGNMENT_NONE) { 448 alignment_ != DOCKED_ALIGNMENT_NONE) {
345 // A window is being added to other docked windows (on the same side). 449 // A window is being added to other docked windows (on the same side).
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 if (launcher_) 515 if (launcher_)
412 shelf_alignment = launcher_->alignment(); 516 shelf_alignment = launcher_->alignment();
413 if ((edge == SNAP_LEFT && shelf_alignment == SHELF_ALIGNMENT_LEFT) || 517 if ((edge == SNAP_LEFT && shelf_alignment == SHELF_ALIGNMENT_LEFT) ||
414 (edge == SNAP_RIGHT && shelf_alignment == SHELF_ALIGNMENT_RIGHT)) { 518 (edge == SNAP_RIGHT && shelf_alignment == SHELF_ALIGNMENT_RIGHT)) {
415 return false; 519 return false;
416 } 520 }
417 return true; 521 return true;
418 } 522 }
419 523
420 //////////////////////////////////////////////////////////////////////////////// 524 ////////////////////////////////////////////////////////////////////////////////
421 // DockLayoutManager, aura::LayoutManager implementation: 525 // DockedWindowLayoutManager, aura::LayoutManager implementation:
422 void DockedWindowLayoutManager::OnWindowResized() { 526 void DockedWindowLayoutManager::OnWindowResized() {
423 MaybeMinimizeChildrenExcept(dragged_window_); 527 MaybeMinimizeChildrenExcept(dragged_window_);
424 Relayout(); 528 Relayout();
425 // When screen resizes update the insets even when dock width or alignment 529 // When screen resizes update the insets even when dock width or alignment
426 // does not change. 530 // does not change.
427 UpdateDockBounds(DockedWindowLayoutManagerObserver::DISPLAY_RESIZED); 531 UpdateDockBounds(DockedWindowLayoutManagerObserver::DISPLAY_RESIZED);
428 } 532 }
429 533
430 void DockedWindowLayoutManager::OnWindowAddedToLayout(aura::Window* child) { 534 void DockedWindowLayoutManager::OnWindowAddedToLayout(aura::Window* child) {
431 if (IsPopupOrTransient(child)) 535 if (IsPopupOrTransient(child))
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 SetChildBoundsDirect(child, requested_bounds); 589 SetChildBoundsDirect(child, requested_bounds);
486 if (IsPopupOrTransient(child)) 590 if (IsPopupOrTransient(child))
487 return; 591 return;
488 ShelfLayoutManager* shelf_layout = internal::ShelfLayoutManager::ForLauncher( 592 ShelfLayoutManager* shelf_layout = internal::ShelfLayoutManager::ForLauncher(
489 dock_container_); 593 dock_container_);
490 if (shelf_layout) 594 if (shelf_layout)
491 shelf_layout->UpdateVisibilityState(); 595 shelf_layout->UpdateVisibilityState();
492 } 596 }
493 597
494 //////////////////////////////////////////////////////////////////////////////// 598 ////////////////////////////////////////////////////////////////////////////////
495 // DockLayoutManager, ash::ShellObserver implementation: 599 // DockedWindowLayoutManager, ash::ShellObserver implementation:
496 600
497 void DockedWindowLayoutManager::OnDisplayWorkAreaInsetsChanged() { 601 void DockedWindowLayoutManager::OnDisplayWorkAreaInsetsChanged() {
498 Relayout(); 602 Relayout();
499 UpdateDockBounds(DockedWindowLayoutManagerObserver::DISPLAY_INSETS_CHANGED); 603 UpdateDockBounds(DockedWindowLayoutManagerObserver::DISPLAY_INSETS_CHANGED);
500 MaybeMinimizeChildrenExcept(dragged_window_); 604 MaybeMinimizeChildrenExcept(dragged_window_);
501 } 605 }
502 606
503 void DockedWindowLayoutManager::OnFullscreenStateChanged( 607 void DockedWindowLayoutManager::OnFullscreenStateChanged(
504 bool is_fullscreen, aura::Window* root_window) { 608 bool is_fullscreen, aura::Window* root_window) {
505 if (dock_container_->GetRootWindow() != root_window) 609 if (dock_container_->GetRootWindow() != root_window)
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 alignment_ = DOCKED_ALIGNMENT_RIGHT; 655 alignment_ = DOCKED_ALIGNMENT_RIGHT;
552 } else if (alignment_ == DOCKED_ALIGNMENT_RIGHT && 656 } else if (alignment_ == DOCKED_ALIGNMENT_RIGHT &&
553 shelf_alignment == SHELF_ALIGNMENT_RIGHT) { 657 shelf_alignment == SHELF_ALIGNMENT_RIGHT) {
554 alignment_ = DOCKED_ALIGNMENT_LEFT; 658 alignment_ = DOCKED_ALIGNMENT_LEFT;
555 } 659 }
556 Relayout(); 660 Relayout();
557 UpdateDockBounds(DockedWindowLayoutManagerObserver::SHELF_ALIGNMENT_CHANGED); 661 UpdateDockBounds(DockedWindowLayoutManagerObserver::SHELF_ALIGNMENT_CHANGED);
558 } 662 }
559 663
560 ///////////////////////////////////////////////////////////////////////////// 664 /////////////////////////////////////////////////////////////////////////////
561 // DockLayoutManager, WindowStateObserver implementation: 665 // DockedWindowLayoutManager, ShelfLayoutManagerObserver implementation:
666 void DockedWindowLayoutManager::OnBackgroundUpdated(
667 ShelfBackgroundType background_type,
668 BackgroundAnimatorChangeType change_type) {
669 background_widget_->SetPaintsBackground(background_type, change_type);
670 }
671
672 /////////////////////////////////////////////////////////////////////////////
673 // DockedWindowLayoutManager, WindowStateObserver implementation:
562 674
563 void DockedWindowLayoutManager::OnWindowShowTypeChanged( 675 void DockedWindowLayoutManager::OnWindowShowTypeChanged(
564 wm::WindowState* window_state, 676 wm::WindowState* window_state,
565 wm::WindowShowType old_type) { 677 wm::WindowShowType old_type) {
566 aura::Window* window = window_state->window(); 678 aura::Window* window = window_state->window();
567 if (IsPopupOrTransient(window)) 679 if (IsPopupOrTransient(window))
568 return; 680 return;
569 // The window property will still be set, but no actual change will occur 681 // The window property will still be set, but no actual change will occur
570 // until OnFullscreenStateChange is called when exiting fullscreen. 682 // until OnFullscreenStateChange is called when exiting fullscreen.
571 if (in_fullscreen_) 683 if (in_fullscreen_)
572 return; 684 return;
573 if (window_state->IsMinimized()) { 685 if (window_state->IsMinimized()) {
574 MinimizeDockedWindow(window_state); 686 MinimizeDockedWindow(window_state);
575 } else if (window_state->IsMaximizedOrFullscreen() || 687 } else if (window_state->IsMaximizedOrFullscreen() ||
576 window_state->IsSnapped()) { 688 window_state->IsSnapped()) {
577 if (window != dragged_window_) { 689 if (window != dragged_window_) {
578 UndockWindow(window); 690 UndockWindow(window);
579 RecordUmaAction(DOCKED_ACTION_MAXIMIZE, DOCKED_ACTION_SOURCE_UNKNOWN); 691 RecordUmaAction(DOCKED_ACTION_MAXIMIZE, DOCKED_ACTION_SOURCE_UNKNOWN);
580 } 692 }
581 } else if (old_type == wm::SHOW_TYPE_MINIMIZED) { 693 } else if (old_type == wm::SHOW_TYPE_MINIMIZED) {
582 RestoreDockedWindow(window_state); 694 RestoreDockedWindow(window_state);
583 } 695 }
584 } 696 }
585 697
586 ///////////////////////////////////////////////////////////////////////////// 698 /////////////////////////////////////////////////////////////////////////////
587 // DockLayoutManager, WindowObserver implementation: 699 // DockedWindowLayoutManager, WindowObserver implementation:
588 700
589 void DockedWindowLayoutManager::OnWindowBoundsChanged( 701 void DockedWindowLayoutManager::OnWindowBoundsChanged(
590 aura::Window* window, 702 aura::Window* window,
591 const gfx::Rect& old_bounds, 703 const gfx::Rect& old_bounds,
592 const gfx::Rect& new_bounds) { 704 const gfx::Rect& new_bounds) {
593 // Only relayout if the dragged window would get docked. 705 // Only relayout if the dragged window would get docked.
594 if (window == dragged_window_ && is_dragged_window_docked_) 706 if (window == dragged_window_ && is_dragged_window_docked_)
595 Relayout(); 707 Relayout();
596 } 708 }
597 709
(...skipping 18 matching lines...) Expand all
616 DCHECK(!dragged_window_); 728 DCHECK(!dragged_window_);
617 DCHECK (!is_dragged_window_docked_); 729 DCHECK (!is_dragged_window_docked_);
618 } 730 }
619 if (window == last_active_window_) 731 if (window == last_active_window_)
620 last_active_window_ = NULL; 732 last_active_window_ = NULL;
621 RecordUmaAction(DOCKED_ACTION_CLOSE, DOCKED_ACTION_SOURCE_UNKNOWN); 733 RecordUmaAction(DOCKED_ACTION_CLOSE, DOCKED_ACTION_SOURCE_UNKNOWN);
622 } 734 }
623 735
624 736
625 //////////////////////////////////////////////////////////////////////////////// 737 ////////////////////////////////////////////////////////////////////////////////
626 // DockLayoutManager, aura::client::ActivationChangeObserver implementation: 738 // DockedWindowLayoutManager, aura::client::ActivationChangeObserver
739 // implementation:
627 740
628 void DockedWindowLayoutManager::OnWindowActivated(aura::Window* gained_active, 741 void DockedWindowLayoutManager::OnWindowActivated(aura::Window* gained_active,
629 aura::Window* lost_active) { 742 aura::Window* lost_active) {
630 if (gained_active && IsPopupOrTransient(gained_active)) 743 if (gained_active && IsPopupOrTransient(gained_active))
631 return; 744 return;
632 // Ignore if the window that is not managed by this was activated. 745 // Ignore if the window that is not managed by this was activated.
633 aura::Window* ancestor = NULL; 746 aura::Window* ancestor = NULL;
634 for (aura::Window* parent = gained_active; 747 for (aura::Window* parent = gained_active;
635 parent; parent = parent->parent()) { 748 parent; parent = parent->parent()) {
636 if (parent->parent() == dock_container_) { 749 if (parent->parent() == dock_container_) {
637 ancestor = parent; 750 ancestor = parent;
638 break; 751 break;
639 } 752 }
640 } 753 }
641 if (ancestor) 754 if (ancestor)
642 UpdateStacking(ancestor); 755 UpdateStacking(ancestor);
643 } 756 }
644 757
645 //////////////////////////////////////////////////////////////////////////////// 758 ////////////////////////////////////////////////////////////////////////////////
646 // DockLayoutManager private implementation: 759 // DockedWindowLayoutManager private implementation:
647 760
648 void DockedWindowLayoutManager::MaybeMinimizeChildrenExcept( 761 void DockedWindowLayoutManager::MaybeMinimizeChildrenExcept(
649 aura::Window* child) { 762 aura::Window* child) {
650 // Minimize any windows that don't fit without overlap. 763 // Minimize any windows that don't fit without overlap.
651 const gfx::Rect work_area = 764 const gfx::Rect work_area =
652 Shell::GetScreen()->GetDisplayNearestWindow(dock_container_).work_area(); 765 Shell::GetScreen()->GetDisplayNearestWindow(dock_container_).work_area();
653 int available_room = work_area.height() - kMinDockGap; 766 int available_room = work_area.height() - kMinDockGap;
654 if (child) 767 if (child)
655 available_room -= (GetWindowHeightCloseTo(child, 0) + kMinDockGap); 768 available_room -= (GetWindowHeightCloseTo(child, 0) + kMinDockGap);
656 // Use a copy of children array because a call to Minimize can change order. 769 // Use a copy of children array because a call to Minimize can change order.
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
991 dock_container_->bounds().y(), 1104 dock_container_->bounds().y(),
992 dock_inset, 1105 dock_inset,
993 work_area.height()); 1106 work_area.height());
994 docked_bounds_ = bounds + 1107 docked_bounds_ = bounds +
995 dock_container_->GetBoundsInScreen().OffsetFromOrigin(); 1108 dock_container_->GetBoundsInScreen().OffsetFromOrigin();
996 FOR_EACH_OBSERVER( 1109 FOR_EACH_OBSERVER(
997 DockedWindowLayoutManagerObserver, 1110 DockedWindowLayoutManagerObserver,
998 observer_list_, 1111 observer_list_,
999 OnDockBoundsChanging(bounds, reason)); 1112 OnDockBoundsChanging(bounds, reason));
1000 // Show or hide background for docked area. 1113 // Show or hide background for docked area.
1001 background_widget_->SetBounds(docked_bounds_); 1114 background_widget_->SetBackgroundBounds(docked_bounds_, alignment_);
1002 if (docked_width_ > 0) { 1115 if (docked_width_ > 0)
1003 background_widget_->Show(); 1116 background_widget_->Show();
1004 background_widget_->GetNativeWindow()->layer()->SetOpacity( 1117 else
1005 kDockBackgroundOpacity);
1006 } else {
1007 background_widget_->Hide(); 1118 background_widget_->Hide();
1008 }
1009 } 1119 }
1010 1120
1011 void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) { 1121 void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) {
1012 if (!active_window) { 1122 if (!active_window) {
1013 if (!last_active_window_) 1123 if (!last_active_window_)
1014 return; 1124 return;
1015 active_window = last_active_window_; 1125 active_window = last_active_window_;
1016 } 1126 }
1017 1127
1018 // Windows are stacked like a deck of cards: 1128 // Windows are stacked like a deck of cards:
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 void DockedWindowLayoutManager::OnKeyboardBoundsChanging( 1179 void DockedWindowLayoutManager::OnKeyboardBoundsChanging(
1070 const gfx::Rect& keyboard_bounds) { 1180 const gfx::Rect& keyboard_bounds) {
1071 // This bounds change will have caused a change to the Shelf which does not 1181 // This bounds change will have caused a change to the Shelf which does not
1072 // propagate automatically to this class, so manually recalculate bounds. 1182 // propagate automatically to this class, so manually recalculate bounds.
1073 Relayout(); 1183 Relayout();
1074 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING); 1184 UpdateDockBounds(DockedWindowLayoutManagerObserver::KEYBOARD_BOUNDS_CHANGING);
1075 } 1185 }
1076 1186
1077 } // namespace internal 1187 } // namespace internal
1078 } // namespace ash 1188 } // namespace ash
OLDNEW
« no previous file with comments | « ash/wm/dock/docked_window_layout_manager.h ('k') | ash/wm/workspace_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698