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/desktop_background/desktop_background_controller.h" |
6 | 6 |
7 #include "ash/ash_switches.h" | 7 #include "ash/ash_switches.h" |
8 #include "ash/desktop_background/desktop_background_controller_observer.h" | 8 #include "ash/desktop_background/desktop_background_controller_observer.h" |
9 #include "ash/desktop_background/desktop_background_view.h" | 9 #include "ash/desktop_background/desktop_background_view.h" |
10 #include "ash/desktop_background/desktop_background_widget_controller.h" | 10 #include "ash/desktop_background/desktop_background_widget_controller.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 #include "ui/gfx/image/image_skia.h" | 32 #include "ui/gfx/image/image_skia.h" |
33 #include "ui/gfx/rect.h" | 33 #include "ui/gfx/rect.h" |
34 #include "ui/views/widget/widget.h" | 34 #include "ui/views/widget/widget.h" |
35 | 35 |
36 using ash::internal::DesktopBackgroundWidgetController; | 36 using ash::internal::DesktopBackgroundWidgetController; |
37 using content::BrowserThread; | 37 using content::BrowserThread; |
38 | 38 |
39 namespace ash { | 39 namespace ash { |
40 namespace { | 40 namespace { |
41 | 41 |
| 42 // How long to wait reloading the wallpaper after the max display has |
| 43 // changed? |
| 44 const int kWallpaperReloadDelayMs = 2000; |
| 45 |
42 const SkColor kTransparentColor = SkColorSetARGB(0x00, 0x00, 0x00, 0x00); | 46 const SkColor kTransparentColor = SkColorSetARGB(0x00, 0x00, 0x00, 0x00); |
43 | 47 |
44 internal::RootWindowLayoutManager* GetRootWindowLayoutManager( | 48 internal::RootWindowLayoutManager* GetRootWindowLayoutManager( |
45 aura::RootWindow* root_window) { | 49 aura::RootWindow* root_window) { |
46 return static_cast<internal::RootWindowLayoutManager*>( | 50 return static_cast<internal::RootWindowLayoutManager*>( |
47 root_window->layout_manager()); | 51 root_window->layout_manager()); |
48 } | 52 } |
49 | 53 |
50 } // namespace | 54 } // namespace |
51 | 55 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 WallpaperLayout resource_layout_; | 158 WallpaperLayout resource_layout_; |
155 | 159 |
156 DISALLOW_COPY_AND_ASSIGN(WallpaperLoader); | 160 DISALLOW_COPY_AND_ASSIGN(WallpaperLoader); |
157 }; | 161 }; |
158 | 162 |
159 DesktopBackgroundController::DesktopBackgroundController() | 163 DesktopBackgroundController::DesktopBackgroundController() |
160 : command_line_for_testing_(NULL), | 164 : command_line_for_testing_(NULL), |
161 locked_(false), | 165 locked_(false), |
162 desktop_background_mode_(BACKGROUND_NONE), | 166 desktop_background_mode_(BACKGROUND_NONE), |
163 current_default_wallpaper_resource_id_(-1), | 167 current_default_wallpaper_resource_id_(-1), |
164 weak_ptr_factory_(this) { | 168 weak_ptr_factory_(this), |
| 169 wallpaper_reload_delay_(kWallpaperReloadDelayMs) { |
| 170 Shell::GetInstance()->display_controller()->AddObserver(this); |
165 } | 171 } |
166 | 172 |
167 DesktopBackgroundController::~DesktopBackgroundController() { | 173 DesktopBackgroundController::~DesktopBackgroundController() { |
168 CancelPendingWallpaperOperation(); | 174 CancelPendingWallpaperOperation(); |
| 175 Shell::GetInstance()->display_controller()->RemoveObserver(this); |
169 } | 176 } |
170 | 177 |
171 gfx::ImageSkia DesktopBackgroundController::GetWallpaper() const { | 178 gfx::ImageSkia DesktopBackgroundController::GetWallpaper() const { |
172 if (current_wallpaper_) | 179 if (current_wallpaper_) |
173 return current_wallpaper_->wallpaper_image(); | 180 return current_wallpaper_->wallpaper_image(); |
174 return gfx::ImageSkia(); | 181 return gfx::ImageSkia(); |
175 } | 182 } |
176 | 183 |
177 void DesktopBackgroundController::AddObserver( | 184 void DesktopBackgroundController::AddObserver( |
178 DesktopBackgroundControllerObserver* observer) { | 185 DesktopBackgroundControllerObserver* observer) { |
179 observers_.AddObserver(observer); | 186 observers_.AddObserver(observer); |
180 } | 187 } |
181 | 188 |
182 void DesktopBackgroundController::RemoveObserver( | 189 void DesktopBackgroundController::RemoveObserver( |
183 DesktopBackgroundControllerObserver* observer) { | 190 DesktopBackgroundControllerObserver* observer) { |
184 observers_.RemoveObserver(observer); | 191 observers_.RemoveObserver(observer); |
185 } | 192 } |
186 | 193 |
187 WallpaperLayout DesktopBackgroundController::GetWallpaperLayout() const { | 194 WallpaperLayout DesktopBackgroundController::GetWallpaperLayout() const { |
188 if (current_wallpaper_) | 195 if (current_wallpaper_) |
189 return current_wallpaper_->layout(); | 196 return current_wallpaper_->layout(); |
190 return WALLPAPER_LAYOUT_CENTER_CROPPED; | 197 return WALLPAPER_LAYOUT_CENTER_CROPPED; |
191 } | 198 } |
192 | 199 |
193 void DesktopBackgroundController::OnRootWindowAdded( | 200 void DesktopBackgroundController::OnRootWindowAdded( |
194 aura::RootWindow* root_window) { | 201 aura::RootWindow* root_window) { |
195 // The background hasn't been set yet. | 202 // The background hasn't been set yet. |
196 if (desktop_background_mode_ == BACKGROUND_NONE) | 203 if (desktop_background_mode_ == BACKGROUND_NONE) |
197 return; | 204 return; |
198 | 205 gfx::Size max_display_size = GetMaxDisplaySizeInNative(); |
199 // Handle resolution change for "built-in" images. | 206 // Handle resolution change for "built-in" images. |
200 if (BACKGROUND_IMAGE == desktop_background_mode_ && | 207 if (BACKGROUND_IMAGE == desktop_background_mode_ && |
201 current_wallpaper_.get()) { | 208 current_wallpaper_.get() && |
202 gfx::Size root_window_size = root_window->GetHostSize(); | 209 current_max_display_size_ != max_display_size) { |
203 int width = current_wallpaper_->wallpaper_image().width(); | 210 current_max_display_size_ = max_display_size; |
204 int height = current_wallpaper_->wallpaper_image().height(); | 211 UpdateWallpaper(); |
205 // Reloads wallpaper if current wallpaper is smaller than the new added root | |
206 // window. | |
207 if (width < root_window_size.width() || | |
208 height < root_window_size.height()) { | |
209 current_wallpaper_.reset(NULL); | |
210 current_default_wallpaper_path_ = base::FilePath(); | |
211 current_default_wallpaper_resource_id_ = -1; | |
212 ash::Shell::GetInstance()->user_wallpaper_delegate()-> | |
213 UpdateWallpaper(); | |
214 } | |
215 } | 212 } |
216 | 213 |
217 InstallDesktopController(root_window); | 214 InstallDesktopController(root_window); |
218 } | 215 } |
219 | 216 |
220 bool DesktopBackgroundController::SetDefaultWallpaper(bool is_guest) { | 217 bool DesktopBackgroundController::SetDefaultWallpaper(bool is_guest) { |
221 const bool use_large = | 218 const bool use_large = |
222 GetAppropriateResolution() == WALLPAPER_RESOLUTION_LARGE; | 219 GetAppropriateResolution() == WALLPAPER_RESOLUTION_LARGE; |
223 | 220 |
224 base::FilePath file_path; | 221 base::FilePath file_path; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 } | 300 } |
304 | 301 |
305 bool DesktopBackgroundController::MoveDesktopToUnlockedContainer() { | 302 bool DesktopBackgroundController::MoveDesktopToUnlockedContainer() { |
306 if (!locked_) | 303 if (!locked_) |
307 return false; | 304 return false; |
308 locked_ = false; | 305 locked_ = false; |
309 return ReparentBackgroundWidgets(GetBackgroundContainerId(true), | 306 return ReparentBackgroundWidgets(GetBackgroundContainerId(true), |
310 GetBackgroundContainerId(false)); | 307 GetBackgroundContainerId(false)); |
311 } | 308 } |
312 | 309 |
| 310 void DesktopBackgroundController::OnDisplayConfigurationChanged() { |
| 311 gfx::Size max_display_size = GetMaxDisplaySizeInNative(); |
| 312 if (current_max_display_size_ != max_display_size) { |
| 313 current_max_display_size_ = max_display_size; |
| 314 timer_.Stop(); |
| 315 timer_.Start(FROM_HERE, |
| 316 base::TimeDelta::FromMilliseconds(wallpaper_reload_delay_), |
| 317 this, |
| 318 &DesktopBackgroundController::UpdateWallpaper); |
| 319 } |
| 320 } |
| 321 |
313 bool DesktopBackgroundController::DefaultWallpaperIsAlreadyLoadingOrLoaded( | 322 bool DesktopBackgroundController::DefaultWallpaperIsAlreadyLoadingOrLoaded( |
314 const base::FilePath& image_file, int image_resource_id) const { | 323 const base::FilePath& image_file, int image_resource_id) const { |
315 return (wallpaper_loader_.get() && | 324 return (wallpaper_loader_.get() && |
316 wallpaper_loader_->file_path() == image_file && | 325 wallpaper_loader_->file_path() == image_file && |
317 wallpaper_loader_->resource_id() == image_resource_id) || | 326 wallpaper_loader_->resource_id() == image_resource_id) || |
318 (current_wallpaper_.get() && | 327 (current_wallpaper_.get() && |
319 current_default_wallpaper_path_ == image_file && | 328 current_default_wallpaper_path_ == image_file && |
320 current_default_wallpaper_resource_id_ == image_resource_id); | 329 current_default_wallpaper_resource_id_ == image_resource_id); |
321 } | 330 } |
322 | 331 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 | 377 |
369 component->StartAnimating(internal::GetRootWindowController(root_window)); | 378 component->StartAnimating(internal::GetRootWindowController(root_window)); |
370 } | 379 } |
371 | 380 |
372 void DesktopBackgroundController::InstallDesktopControllerForAllWindows() { | 381 void DesktopBackgroundController::InstallDesktopControllerForAllWindows() { |
373 Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); | 382 Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); |
374 for (Shell::RootWindowList::iterator iter = root_windows.begin(); | 383 for (Shell::RootWindowList::iterator iter = root_windows.begin(); |
375 iter != root_windows.end(); ++iter) { | 384 iter != root_windows.end(); ++iter) { |
376 InstallDesktopController(*iter); | 385 InstallDesktopController(*iter); |
377 } | 386 } |
| 387 current_max_display_size_ = GetMaxDisplaySizeInNative(); |
378 } | 388 } |
379 | 389 |
380 bool DesktopBackgroundController::ReparentBackgroundWidgets(int src_container, | 390 bool DesktopBackgroundController::ReparentBackgroundWidgets(int src_container, |
381 int dst_container) { | 391 int dst_container) { |
382 bool moved = false; | 392 bool moved = false; |
383 Shell::RootWindowControllerList controllers = | 393 Shell::RootWindowControllerList controllers = |
384 Shell::GetAllRootWindowControllers(); | 394 Shell::GetAllRootWindowControllers(); |
385 for (Shell::RootWindowControllerList::iterator iter = controllers.begin(); | 395 for (Shell::RootWindowControllerList::iterator iter = controllers.begin(); |
386 iter != controllers.end(); ++iter) { | 396 iter != controllers.end(); ++iter) { |
387 internal::RootWindowController* root_window_controller = *iter; | 397 internal::RootWindowController* root_window_controller = *iter; |
(...skipping 25 matching lines...) Expand all Loading... |
413 } | 423 } |
414 } | 424 } |
415 return moved; | 425 return moved; |
416 } | 426 } |
417 | 427 |
418 int DesktopBackgroundController::GetBackgroundContainerId(bool locked) { | 428 int DesktopBackgroundController::GetBackgroundContainerId(bool locked) { |
419 return locked ? internal::kShellWindowId_LockScreenBackgroundContainer : | 429 return locked ? internal::kShellWindowId_LockScreenBackgroundContainer : |
420 internal::kShellWindowId_DesktopBackgroundContainer; | 430 internal::kShellWindowId_DesktopBackgroundContainer; |
421 } | 431 } |
422 | 432 |
| 433 void DesktopBackgroundController::UpdateWallpaper() { |
| 434 current_wallpaper_.reset(NULL); |
| 435 current_default_wallpaper_path_ = base::FilePath(); |
| 436 current_default_wallpaper_resource_id_ = -1; |
| 437 ash::Shell::GetInstance()->user_wallpaper_delegate()-> |
| 438 UpdateWallpaper(); |
| 439 } |
| 440 |
423 // static | 441 // static |
424 gfx::Size DesktopBackgroundController::GetMaxDisplaySizeInNative() { | 442 gfx::Size DesktopBackgroundController::GetMaxDisplaySizeInNative() { |
425 int width = 0; | 443 int width = 0; |
426 int height = 0; | 444 int height = 0; |
427 std::vector<gfx::Display> displays = Shell::GetScreen()->GetAllDisplays(); | 445 std::vector<gfx::Display> displays = Shell::GetScreen()->GetAllDisplays(); |
428 internal::DisplayManager* display_manager = | 446 internal::DisplayManager* display_manager = |
429 Shell::GetInstance()->display_manager(); | 447 Shell::GetInstance()->display_manager(); |
430 | 448 |
431 for (std::vector<gfx::Display>::iterator iter = displays.begin(); | 449 for (std::vector<gfx::Display>::iterator iter = displays.begin(); |
432 iter != displays.end(); ++iter) { | 450 iter != displays.end(); ++iter) { |
433 // Don't use size_in_pixel because we want to use the native pixel size. | 451 // Don't use size_in_pixel because we want to use the native pixel size. |
434 gfx::Size size_in_pixel = | 452 gfx::Size size_in_pixel = |
435 display_manager->GetDisplayInfo(iter->id()).bounds_in_native().size(); | 453 display_manager->GetDisplayInfo(iter->id()).bounds_in_native().size(); |
436 if (iter->rotation() == gfx::Display::ROTATE_90 || | 454 if (iter->rotation() == gfx::Display::ROTATE_90 || |
437 iter->rotation() == gfx::Display::ROTATE_270) { | 455 iter->rotation() == gfx::Display::ROTATE_270) { |
438 size_in_pixel = gfx::Size(size_in_pixel.height(), size_in_pixel.width()); | 456 size_in_pixel = gfx::Size(size_in_pixel.height(), size_in_pixel.width()); |
439 } | 457 } |
440 width = std::max(size_in_pixel.width(), width); | 458 width = std::max(size_in_pixel.width(), width); |
441 height = std::max(size_in_pixel.height(), height); | 459 height = std::max(size_in_pixel.height(), height); |
442 } | 460 } |
443 return gfx::Size(width, height); | 461 return gfx::Size(width, height); |
444 } | 462 } |
445 | 463 |
446 } // namespace ash | 464 } // namespace ash |
OLD | NEW |