Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/desktop_background/desktop_background_controller.h" | 5 #include "ash/wallpaper/wallpaper_controller.h" |
| 6 | 6 |
| 7 #include "ash/aura/wm_window_aura.h" | 7 #include "ash/aura/wm_window_aura.h" |
| 8 #include "ash/common/display/display_info.h" | 8 #include "ash/common/display/display_info.h" |
| 9 #include "ash/common/shell_window_ids.h" | 9 #include "ash/common/shell_window_ids.h" |
| 10 #include "ash/common/wallpaper/wallpaper_delegate.h" | 10 #include "ash/common/wallpaper/wallpaper_delegate.h" |
| 11 #include "ash/common/wm_shell.h" | 11 #include "ash/common/wm_shell.h" |
| 12 #include "ash/desktop_background/desktop_background_controller_observer.h" | |
| 13 #include "ash/desktop_background/desktop_background_view.h" | |
| 14 #include "ash/desktop_background/desktop_background_widget_controller.h" | |
| 15 #include "ash/root_window_controller.h" | 12 #include "ash/root_window_controller.h" |
| 16 #include "ash/shell.h" | 13 #include "ash/shell.h" |
| 14 #include "ash/wallpaper/wallpaper_controller_observer.h" | |
| 15 #include "ash/wallpaper/wallpaper_view.h" | |
| 16 #include "ash/wallpaper/wallpaper_widget_controller.h" | |
| 17 #include "base/bind.h" | 17 #include "base/bind.h" |
| 18 #include "base/logging.h" | 18 #include "base/logging.h" |
| 19 #include "base/threading/sequenced_worker_pool.h" | 19 #include "base/threading/sequenced_worker_pool.h" |
| 20 #include "components/wallpaper/wallpaper_resizer.h" | 20 #include "components/wallpaper/wallpaper_resizer.h" |
| 21 #include "ui/aura/window.h" | 21 #include "ui/aura/window.h" |
| 22 #include "ui/display/screen.h" | 22 #include "ui/display/screen.h" |
| 23 #include "ui/views/widget/widget.h" | 23 #include "ui/views/widget/widget.h" |
| 24 | 24 |
| 25 namespace ash { | 25 namespace ash { |
| 26 namespace { | 26 namespace { |
| 27 | 27 |
| 28 // How long to wait reloading the wallpaper after the display size has changed. | 28 // How long to wait reloading the wallpaper after the display size has changed. |
| 29 const int kWallpaperReloadDelayMs = 100; | 29 const int kWallpaperReloadDelayMs = 100; |
| 30 | 30 |
| 31 } // namespace | 31 } // namespace |
| 32 | 32 |
| 33 DesktopBackgroundController::DesktopBackgroundController( | 33 WallpaperController::WallpaperController( |
| 34 base::SequencedWorkerPool* blocking_pool) | 34 base::SequencedWorkerPool* blocking_pool) |
| 35 : locked_(false), | 35 : locked_(false), |
| 36 desktop_background_mode_(BACKGROUND_NONE), | 36 wallpaper_mode_(WALLPAPER_NONE), |
| 37 wallpaper_reload_delay_(kWallpaperReloadDelayMs), | 37 wallpaper_reload_delay_(kWallpaperReloadDelayMs), |
| 38 blocking_pool_(blocking_pool) { | 38 blocking_pool_(blocking_pool) { |
| 39 WmShell::Get()->AddDisplayObserver(this); | 39 WmShell::Get()->AddDisplayObserver(this); |
| 40 WmShell::Get()->AddShellObserver(this); | 40 WmShell::Get()->AddShellObserver(this); |
| 41 } | 41 } |
| 42 | 42 |
| 43 DesktopBackgroundController::~DesktopBackgroundController() { | 43 WallpaperController::~WallpaperController() { |
| 44 WmShell::Get()->RemoveDisplayObserver(this); | 44 WmShell::Get()->RemoveDisplayObserver(this); |
| 45 WmShell::Get()->RemoveShellObserver(this); | 45 WmShell::Get()->RemoveShellObserver(this); |
| 46 } | 46 } |
| 47 | 47 |
| 48 gfx::ImageSkia DesktopBackgroundController::GetWallpaper() const { | 48 gfx::ImageSkia WallpaperController::GetWallpaper() const { |
| 49 if (current_wallpaper_) | 49 if (current_wallpaper_) |
| 50 return current_wallpaper_->image(); | 50 return current_wallpaper_->image(); |
| 51 return gfx::ImageSkia(); | 51 return gfx::ImageSkia(); |
| 52 } | 52 } |
| 53 | 53 |
| 54 void DesktopBackgroundController::AddObserver( | 54 void WallpaperController::AddObserver(WallpaperControllerObserver* observer) { |
| 55 DesktopBackgroundControllerObserver* observer) { | |
| 56 observers_.AddObserver(observer); | 55 observers_.AddObserver(observer); |
| 57 } | 56 } |
| 58 | 57 |
| 59 void DesktopBackgroundController::RemoveObserver( | 58 void WallpaperController::RemoveObserver( |
| 60 DesktopBackgroundControllerObserver* observer) { | 59 WallpaperControllerObserver* observer) { |
| 61 observers_.RemoveObserver(observer); | 60 observers_.RemoveObserver(observer); |
| 62 } | 61 } |
| 63 | 62 |
| 64 wallpaper::WallpaperLayout DesktopBackgroundController::GetWallpaperLayout() | 63 wallpaper::WallpaperLayout WallpaperController::GetWallpaperLayout() const { |
| 65 const { | |
| 66 if (current_wallpaper_) | 64 if (current_wallpaper_) |
| 67 return current_wallpaper_->layout(); | 65 return current_wallpaper_->layout(); |
| 68 return wallpaper::WALLPAPER_LAYOUT_CENTER_CROPPED; | 66 return wallpaper::WALLPAPER_LAYOUT_CENTER_CROPPED; |
| 69 } | 67 } |
| 70 | 68 |
| 71 bool DesktopBackgroundController::SetWallpaperImage( | 69 bool WallpaperController::SetWallpaperImage(const gfx::ImageSkia& image, |
| 72 const gfx::ImageSkia& image, | 70 wallpaper::WallpaperLayout layout) { |
| 73 wallpaper::WallpaperLayout layout) { | |
| 74 VLOG(1) << "SetWallpaper: image_id=" | 71 VLOG(1) << "SetWallpaper: image_id=" |
| 75 << wallpaper::WallpaperResizer::GetImageId(image) | 72 << wallpaper::WallpaperResizer::GetImageId(image) |
| 76 << " layout=" << layout; | 73 << " layout=" << layout; |
| 77 | 74 |
| 78 if (WallpaperIsAlreadyLoaded(image, true /* compare_layouts */, layout)) { | 75 if (WallpaperIsAlreadyLoaded(image, true /* compare_layouts */, layout)) { |
| 79 VLOG(1) << "Wallpaper is already loaded"; | 76 VLOG(1) << "Wallpaper is already loaded"; |
| 80 return false; | 77 return false; |
| 81 } | 78 } |
| 82 | 79 |
| 83 current_wallpaper_.reset(new wallpaper::WallpaperResizer( | 80 current_wallpaper_.reset(new wallpaper::WallpaperResizer( |
| 84 image, GetMaxDisplaySizeInNative(), layout, blocking_pool_)); | 81 image, GetMaxDisplaySizeInNative(), layout, blocking_pool_)); |
| 85 current_wallpaper_->StartResize(); | 82 current_wallpaper_->StartResize(); |
| 86 | 83 |
| 87 FOR_EACH_OBSERVER(DesktopBackgroundControllerObserver, observers_, | 84 FOR_EACH_OBSERVER(WallpaperControllerObserver, observers_, |
| 88 OnWallpaperDataChanged()); | 85 OnWallpaperDataChanged()); |
| 89 desktop_background_mode_ = BACKGROUND_IMAGE; | 86 wallpaper_mode_ = WALLPAPER_IMAGE; |
| 90 InstallDesktopControllerForAllWindows(); | 87 InstallDesktopControllerForAllWindows(); |
| 91 return true; | 88 return true; |
| 92 } | 89 } |
| 93 | 90 |
| 94 void DesktopBackgroundController::CreateEmptyWallpaper() { | 91 void WallpaperController::CreateEmptyWallpaper() { |
| 95 current_wallpaper_.reset(); | 92 current_wallpaper_.reset(); |
| 96 desktop_background_mode_ = BACKGROUND_IMAGE; | 93 wallpaper_mode_ = WALLPAPER_IMAGE; |
| 97 InstallDesktopControllerForAllWindows(); | 94 InstallDesktopControllerForAllWindows(); |
| 98 } | 95 } |
| 99 | 96 |
| 100 bool DesktopBackgroundController::MoveDesktopToLockedContainer() { | 97 bool WallpaperController::MoveToLockedContainer() { |
| 101 if (locked_) | 98 if (locked_) |
| 102 return false; | 99 return false; |
| 103 locked_ = true; | 100 locked_ = true; |
| 104 return ReparentBackgroundWidgets(GetBackgroundContainerId(false), | 101 return ReparentWallpaper(GetWallpaperContainerId(true)); |
| 105 GetBackgroundContainerId(true)); | |
| 106 } | 102 } |
| 107 | 103 |
| 108 bool DesktopBackgroundController::MoveDesktopToUnlockedContainer() { | 104 bool WallpaperController::MoveToUnlockedContainer() { |
| 109 if (!locked_) | 105 if (!locked_) |
| 110 return false; | 106 return false; |
| 111 locked_ = false; | 107 locked_ = false; |
| 112 return ReparentBackgroundWidgets(GetBackgroundContainerId(true), | 108 return ReparentWallpaper(GetWallpaperContainerId(false)); |
| 113 GetBackgroundContainerId(false)); | |
| 114 } | 109 } |
| 115 | 110 |
| 116 void DesktopBackgroundController::OnDisplayConfigurationChanged() { | 111 void WallpaperController::OnDisplayConfigurationChanged() { |
| 117 gfx::Size max_display_size = GetMaxDisplaySizeInNative(); | 112 gfx::Size max_display_size = GetMaxDisplaySizeInNative(); |
| 118 if (current_max_display_size_ != max_display_size) { | 113 if (current_max_display_size_ != max_display_size) { |
| 119 current_max_display_size_ = max_display_size; | 114 current_max_display_size_ = max_display_size; |
| 120 if (desktop_background_mode_ == BACKGROUND_IMAGE && current_wallpaper_) { | 115 if (wallpaper_mode_ == WALLPAPER_IMAGE && current_wallpaper_) { |
| 121 timer_.Stop(); | 116 timer_.Stop(); |
| 122 timer_.Start(FROM_HERE, | 117 timer_.Start(FROM_HERE, |
| 123 base::TimeDelta::FromMilliseconds(wallpaper_reload_delay_), | 118 base::TimeDelta::FromMilliseconds(wallpaper_reload_delay_), |
| 124 base::Bind(&DesktopBackgroundController::UpdateWallpaper, | 119 base::Bind(&WallpaperController::UpdateWallpaper, |
| 125 base::Unretained(this), false /* clear cache */)); | 120 base::Unretained(this), false /* clear cache */)); |
| 126 } | 121 } |
| 127 } | 122 } |
| 128 } | 123 } |
| 129 | 124 |
| 130 void DesktopBackgroundController::OnRootWindowAdded(WmWindow* root_window) { | 125 void WallpaperController::OnRootWindowAdded(WmWindow* root_window) { |
| 131 // The background hasn't been set yet. | 126 // The wallpaper hasn't been set yet. |
| 132 if (desktop_background_mode_ == BACKGROUND_NONE) | 127 if (wallpaper_mode_ == WALLPAPER_NONE) |
| 133 return; | 128 return; |
| 134 | 129 |
| 135 // Handle resolution change for "built-in" images. | 130 // Handle resolution change for "built-in" images. |
| 136 gfx::Size max_display_size = GetMaxDisplaySizeInNative(); | 131 gfx::Size max_display_size = GetMaxDisplaySizeInNative(); |
| 137 if (current_max_display_size_ != max_display_size) { | 132 if (current_max_display_size_ != max_display_size) { |
| 138 current_max_display_size_ = max_display_size; | 133 current_max_display_size_ = max_display_size; |
| 139 if (desktop_background_mode_ == BACKGROUND_IMAGE && current_wallpaper_) | 134 if (wallpaper_mode_ == WALLPAPER_IMAGE && current_wallpaper_) |
| 140 UpdateWallpaper(true /* clear cache */); | 135 UpdateWallpaper(true /* clear cache */); |
| 141 } | 136 } |
| 142 | 137 |
| 143 InstallDesktopController(root_window); | 138 InstallDesktopController(root_window); |
| 144 } | 139 } |
| 145 | 140 |
| 146 // static | 141 // static |
| 147 gfx::Size DesktopBackgroundController::GetMaxDisplaySizeInNative() { | 142 gfx::Size WallpaperController::GetMaxDisplaySizeInNative() { |
| 148 // Return an empty size for test environments where the screen is null. | 143 // Return an empty size for test environments where the screen is null. |
| 149 if (!display::Screen::GetScreen()) | 144 if (!display::Screen::GetScreen()) |
| 150 return gfx::Size(); | 145 return gfx::Size(); |
| 151 | 146 |
| 152 // Note that |shell| is null when this is called from Chrome running in Mash. | 147 // Note that |shell| is null when this is called from Chrome running in Mash. |
| 153 WmShell* shell = WmShell::Get(); | 148 WmShell* shell = WmShell::Get(); |
| 154 | 149 |
| 155 gfx::Size max; | 150 gfx::Size max; |
| 156 for (const auto& display : display::Screen::GetScreen()->GetAllDisplays()) { | 151 for (const auto& display : display::Screen::GetScreen()->GetAllDisplays()) { |
| 157 // Use the native size, not DisplayInfo::size_in_pixel or Display::size. | 152 // Use the native size, not DisplayInfo::size_in_pixel or Display::size. |
| 158 // TODO(msw): Avoid using Display::size here; see http://crbug.com/613657. | 153 // TODO(msw): Avoid using Display::size here; see http://crbug.com/613657. |
| 159 gfx::Size size = display.size(); | 154 gfx::Size size = display.size(); |
| 160 if (shell) | 155 if (shell) |
| 161 size = shell->GetDisplayInfo(display.id()).bounds_in_native().size(); | 156 size = shell->GetDisplayInfo(display.id()).bounds_in_native().size(); |
| 162 if (display.rotation() == display::Display::ROTATE_90 || | 157 if (display.rotation() == display::Display::ROTATE_90 || |
| 163 display.rotation() == display::Display::ROTATE_270) { | 158 display.rotation() == display::Display::ROTATE_270) { |
| 164 size = gfx::Size(size.height(), size.width()); | 159 size = gfx::Size(size.height(), size.width()); |
| 165 } | 160 } |
| 166 max.SetToMax(size); | 161 max.SetToMax(size); |
| 167 } | 162 } |
| 168 | 163 |
| 169 return max; | 164 return max; |
| 170 } | 165 } |
| 171 | 166 |
| 172 bool DesktopBackgroundController::WallpaperIsAlreadyLoaded( | 167 bool WallpaperController::WallpaperIsAlreadyLoaded( |
| 173 const gfx::ImageSkia& image, | 168 const gfx::ImageSkia& image, |
| 174 bool compare_layouts, | 169 bool compare_layouts, |
| 175 wallpaper::WallpaperLayout layout) const { | 170 wallpaper::WallpaperLayout layout) const { |
| 176 if (!current_wallpaper_) | 171 if (!current_wallpaper_) |
| 177 return false; | 172 return false; |
| 178 | 173 |
| 179 // Compare layouts only if necessary. | 174 // Compare layouts only if necessary. |
| 180 if (compare_layouts && layout != current_wallpaper_->layout()) | 175 if (compare_layouts && layout != current_wallpaper_->layout()) |
| 181 return false; | 176 return false; |
| 182 | 177 |
| 183 return wallpaper::WallpaperResizer::GetImageId(image) == | 178 return wallpaper::WallpaperResizer::GetImageId(image) == |
| 184 current_wallpaper_->original_image_id(); | 179 current_wallpaper_->original_image_id(); |
| 185 } | 180 } |
| 186 | 181 |
| 187 void DesktopBackgroundController::InstallDesktopController( | 182 void WallpaperController::InstallDesktopController(WmWindow* root_window) { |
| 188 WmWindow* root_window) { | 183 WallpaperWidgetController* component = nullptr; |
| 189 DesktopBackgroundWidgetController* component = nullptr; | 184 int container_id = GetWallpaperContainerId(locked_); |
| 190 int container_id = GetBackgroundContainerId(locked_); | |
| 191 | 185 |
| 192 switch (desktop_background_mode_) { | 186 switch (wallpaper_mode_) { |
| 193 case BACKGROUND_IMAGE: { | 187 case WALLPAPER_IMAGE: { |
| 194 component = new DesktopBackgroundWidgetController( | 188 component = new WallpaperWidgetController( |
| 195 CreateDesktopBackground(root_window, container_id)); | 189 CreateWallpaper(root_window, container_id)); |
| 196 break; | 190 break; |
| 197 } | 191 } |
| 198 case BACKGROUND_NONE: | 192 case WALLPAPER_NONE: |
| 199 NOTREACHED(); | 193 NOTREACHED(); |
| 200 return; | 194 return; |
| 201 } | 195 } |
| 202 | 196 |
| 203 aura::Window* aura_root_window = WmWindowAura::GetAuraWindow(root_window); | 197 aura::Window* aura_root_window = WmWindowAura::GetAuraWindow(root_window); |
| 204 RootWindowController* controller = GetRootWindowController(aura_root_window); | 198 RootWindowController* controller = GetRootWindowController(aura_root_window); |
| 205 controller->SetAnimatingWallpaperController( | 199 controller->SetAnimatingWallpaperController( |
| 206 new AnimatingDesktopController(component)); | 200 new AnimatingDesktopController(component)); |
| 207 component->StartAnimating(controller); | 201 component->StartAnimating(controller); |
| 208 } | 202 } |
| 209 | 203 |
| 210 void DesktopBackgroundController::InstallDesktopControllerForAllWindows() { | 204 void WallpaperController::InstallDesktopControllerForAllWindows() { |
| 211 for (WmWindow* root : WmShell::Get()->GetAllRootWindows()) | 205 for (WmWindow* root : WmShell::Get()->GetAllRootWindows()) |
| 212 InstallDesktopController(root); | 206 InstallDesktopController(root); |
| 213 current_max_display_size_ = GetMaxDisplaySizeInNative(); | 207 current_max_display_size_ = GetMaxDisplaySizeInNative(); |
| 214 } | 208 } |
| 215 | 209 |
| 216 bool DesktopBackgroundController::ReparentBackgroundWidgets(int src_container, | 210 bool WallpaperController::ReparentWallpaper(int container) { |
| 217 int dst_container) { | |
| 218 bool moved = false; | 211 bool moved = false; |
| 219 for (auto* root_window_controller : Shell::GetAllRootWindowControllers()) { | 212 for (auto* root_window_controller : Shell::GetAllRootWindowControllers()) { |
| 220 // In the steady state (no animation playing) the background widget | 213 // In the steady state (no animation playing) the wallpaper widget |
| 221 // controller exists in the RootWindowController. | 214 // controller exists in the RootWindowController. |
| 222 DesktopBackgroundWidgetController* desktop_controller = | 215 WallpaperWidgetController* wallpaper_controller = |
| 223 root_window_controller->wallpaper_controller(); | 216 root_window_controller->wallpaper_controller(); |
| 224 if (desktop_controller) { | 217 if (wallpaper_controller) { |
| 225 moved |= | 218 moved |= wallpaper_controller->Reparent( |
| 226 desktop_controller->Reparent(root_window_controller->GetRootWindow(), | 219 root_window_controller->GetRootWindow(), container); |
| 227 src_container, dst_container); | |
| 228 } | 220 } |
| 229 // During desktop show animations the controller lives in | 221 // During wallpaper show animations the controller lives in |
| 230 // AnimatingDesktopController owned by RootWindowController. | 222 // AnimatingDesktopController owned by RootWindowController. |
| 231 // NOTE: If a wallpaper load happens during a desktop show animation there | 223 // NOTE: If an image load happens during a wallpaper show animation there |
| 232 // can temporarily be two desktop background widgets. We must reparent | 224 // can temporarily be two wallpaper wallpaper widgets. We must reparent both |
|
James Cook
2016/08/30 05:18:19
nit: wallpaper wallpaper -> wallpaper
msw
2016/08/30 16:07:59
Done.
| |
| 233 // both of them - one above and one here. | 225 // of them - one above and one here. |
| 234 DesktopBackgroundWidgetController* animating_controller = | 226 WallpaperWidgetController* animating_controller = |
| 235 root_window_controller->animating_wallpaper_controller() | 227 root_window_controller->animating_wallpaper_controller() |
| 236 ? root_window_controller->animating_wallpaper_controller() | 228 ? root_window_controller->animating_wallpaper_controller() |
| 237 ->GetController(false) | 229 ->GetController(false) |
| 238 : nullptr; | 230 : nullptr; |
| 239 if (animating_controller) { | 231 if (animating_controller) { |
| 240 moved |= animating_controller->Reparent( | 232 moved |= animating_controller->Reparent( |
| 241 root_window_controller->GetRootWindow(), src_container, | 233 root_window_controller->GetRootWindow(), container); |
| 242 dst_container); | |
| 243 } | 234 } |
| 244 } | 235 } |
| 245 return moved; | 236 return moved; |
| 246 } | 237 } |
|
James Cook
2016/08/30 05:18:19
Aside: I once spent ~2 weeks tracking down a bug t
msw
2016/08/30 16:07:59
Yikes!
| |
| 247 | 238 |
| 248 int DesktopBackgroundController::GetBackgroundContainerId(bool locked) { | 239 int WallpaperController::GetWallpaperContainerId(bool locked) { |
| 249 return locked ? kShellWindowId_LockScreenBackgroundContainer | 240 return locked ? kShellWindowId_LockScreenWallpaperContainer |
| 250 : kShellWindowId_DesktopBackgroundContainer; | 241 : kShellWindowId_WallpaperContainer; |
| 251 } | 242 } |
| 252 | 243 |
| 253 void DesktopBackgroundController::UpdateWallpaper(bool clear_cache) { | 244 void WallpaperController::UpdateWallpaper(bool clear_cache) { |
| 254 current_wallpaper_.reset(); | 245 current_wallpaper_.reset(); |
| 255 WmShell::Get()->wallpaper_delegate()->UpdateWallpaper(clear_cache); | 246 WmShell::Get()->wallpaper_delegate()->UpdateWallpaper(clear_cache); |
| 256 } | 247 } |
| 257 | 248 |
| 258 } // namespace ash | 249 } // namespace ash |
| OLD | NEW |