resize_shadow_controller.cc 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/wm/resize_shadow_controller.h"
  5. #include <memory>
  6. #include "ash/public/cpp/window_properties.h"
  7. #include "ash/shell.h"
  8. #include "ash/wm/overview/overview_controller.h"
  9. #include "ash/wm/resize_shadow.h"
  10. #include "ui/aura/client/aura_constants.h"
  11. namespace ash {
  12. namespace {
  13. // Lock shadow params
  14. constexpr ResizeShadow::InitParams kLockParams{
  15. /*thickness=*/6,
  16. /*shadow_corner_radius=*/6,
  17. /*window_corner_radius=*/2,
  18. /*opacity =*/0.3f,
  19. /*color=*/gfx::kGoogleGrey900,
  20. /*hit_test_enabled=*/false,
  21. /*hide_duration_ms=*/0,
  22. };
  23. } // namespace
  24. ResizeShadowController::ResizeShadowController() = default;
  25. ResizeShadowController::~ResizeShadowController() {
  26. RemoveAllShadows();
  27. }
  28. void ResizeShadowController::ShowShadow(aura::Window* window, int hit_test) {
  29. RecreateShadowIfNeeded(window);
  30. if (ShouldShowShadowForWindow(window) && window->IsVisible())
  31. GetShadowForWindow(window)->ShowForHitTest(hit_test);
  32. }
  33. void ResizeShadowController::TryShowAllShadows() {
  34. for (const auto& shadow : window_shadows_)
  35. UpdateShadowVisibility(shadow.first, shadow.first->IsVisible());
  36. }
  37. void ResizeShadowController::HideShadow(aura::Window* window) {
  38. ResizeShadow* shadow = GetShadowForWindow(window);
  39. if (!shadow)
  40. return;
  41. UpdateShadowVisibility(window, false);
  42. }
  43. void ResizeShadowController::HideAllShadows() {
  44. for (auto& shadow : window_shadows_) {
  45. if (!shadow.second)
  46. continue;
  47. switch (shadow.second->type_) {
  48. case ResizeShadowType::kLock: { // Hides lock style of shadow
  49. UpdateShadowVisibility(shadow.first, false);
  50. break;
  51. }
  52. case ResizeShadowType::kUnlock: { // Deletes unlock style of shadow
  53. shadow.second.reset();
  54. break;
  55. }
  56. }
  57. }
  58. }
  59. void ResizeShadowController::RemoveAllShadows() {
  60. windows_observation_.RemoveAllObservations();
  61. window_shadows_.clear();
  62. }
  63. void ResizeShadowController::OnWindowHierarchyChanged(
  64. const aura::WindowObserver::HierarchyChangeParams& params) {
  65. ResizeShadow* shadow = GetShadowForWindow(params.target);
  66. if (shadow)
  67. shadow->ReparentLayer();
  68. }
  69. void ResizeShadowController::OnWindowVisibilityChanging(aura::Window* window,
  70. bool visible) {
  71. UpdateShadowVisibility(window, visible);
  72. }
  73. void ResizeShadowController::OnWindowBoundsChanged(
  74. aura::Window* window,
  75. const gfx::Rect& old_bounds,
  76. const gfx::Rect& new_bounds,
  77. ui::PropertyChangeReason reason) {
  78. ResizeShadow* shadow = GetShadowForWindow(window);
  79. if (shadow && window->GetProperty(aura::client::kUseWindowBoundsForShadow))
  80. shadow->UpdateBoundsAndVisibility();
  81. }
  82. void ResizeShadowController::OnWindowStackingChanged(aura::Window* window) {
  83. ResizeShadow* shadow = GetShadowForWindow(window);
  84. if (shadow)
  85. shadow->ReparentLayer();
  86. }
  87. void ResizeShadowController::OnWindowDestroying(aura::Window* window) {
  88. windows_observation_.RemoveObservation(window);
  89. window_shadows_.erase(window);
  90. }
  91. void ResizeShadowController::OnWindowPropertyChanged(aura::Window* window,
  92. const void* key,
  93. intptr_t old) {
  94. if (key != aura::client::kShowStateKey)
  95. return;
  96. UpdateShadowVisibility(window, window->IsVisible());
  97. }
  98. void ResizeShadowController::UpdateResizeShadowBoundsOfWindow(
  99. aura::Window* window,
  100. const gfx::Rect& bounds) {
  101. ResizeShadow* shadow = GetShadowForWindow(window);
  102. if (shadow)
  103. shadow->UpdateBounds(bounds);
  104. }
  105. ResizeShadow* ResizeShadowController::GetShadowForWindowForTest(
  106. aura::Window* window) {
  107. return GetShadowForWindow(window);
  108. }
  109. void ResizeShadowController::RecreateShadowIfNeeded(aura::Window* window) {
  110. if (!windows_observation_.IsObservingSource(window))
  111. windows_observation_.AddObservation(window);
  112. ResizeShadow* shadow = GetShadowForWindow(window);
  113. const ash::ResizeShadowType type =
  114. window->GetProperty(ash::kResizeShadowTypeKey);
  115. // If the |window| has a resize shadow with the requested type, no need to
  116. // recreate it.
  117. if (shadow && shadow->type_ == type)
  118. return;
  119. ResizeShadow::InitParams params;
  120. if (type == ResizeShadowType::kLock)
  121. params = kLockParams;
  122. auto new_shadow = std::make_unique<ResizeShadow>(window, params, type);
  123. auto it = window_shadows_.find(window);
  124. if (it == window_shadows_.end())
  125. window_shadows_.insert(std::make_pair(window, std::move(new_shadow)));
  126. else
  127. it->second = std::move(new_shadow);
  128. }
  129. ResizeShadow* ResizeShadowController::GetShadowForWindow(
  130. aura::Window* window) const {
  131. auto it = window_shadows_.find(window);
  132. return it != window_shadows_.end() ? it->second.get() : nullptr;
  133. }
  134. void ResizeShadowController::UpdateShadowVisibility(aura::Window* window,
  135. bool visible) const {
  136. ResizeShadow* shadow = GetShadowForWindow(window);
  137. if (!shadow)
  138. return;
  139. if (shadow->type_ == ResizeShadowType::kLock) {
  140. visible &= ShouldShowShadowForWindow(window);
  141. if (visible)
  142. shadow->ShowForHitTest();
  143. }
  144. if (!visible)
  145. shadow->Hide();
  146. }
  147. bool ResizeShadowController::ShouldShowShadowForWindow(
  148. aura::Window* window) const {
  149. // Hide the shadow if it's a maximized/fullscreen/minimized window or the
  150. // overview mode is active.
  151. ui::WindowShowState show_state =
  152. window->GetProperty(aura::client::kShowStateKey);
  153. return show_state != ui::SHOW_STATE_FULLSCREEN &&
  154. show_state != ui::SHOW_STATE_MAXIMIZED &&
  155. show_state != ui::SHOW_STATE_MINIMIZED &&
  156. !Shell::Get()->overview_controller()->InOverviewSession();
  157. }
  158. } // namespace ash