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/desktop_background/desktop_background_controller.h" |
| 6 | 6 |
| 7 #include "ash/desktop_background/desktop_background_controller_observer.h" | 7 #include "ash/desktop_background/desktop_background_controller_observer.h" |
| 8 #include "ash/desktop_background/desktop_background_view.h" | 8 #include "ash/desktop_background/desktop_background_view.h" |
| 9 #include "ash/desktop_background/desktop_background_widget_controller.h" | 9 #include "ash/desktop_background/desktop_background_widget_controller.h" |
| 10 #include "ash/desktop_background/user_wallpaper_delegate.h" | 10 #include "ash/desktop_background/user_wallpaper_delegate.h" |
| 11 #include "ash/root_window_controller.h" | 11 #include "ash/root_window_controller.h" |
| 12 #include "ash/shell.h" | 12 #include "ash/shell.h" |
| 13 #include "ash/shell_factory.h" | 13 #include "ash/shell_factory.h" |
| 14 #include "ash/shell_window_ids.h" | 14 #include "ash/shell_window_ids.h" |
| 15 #include "ash/wm/root_window_layout_manager.h" | 15 #include "ash/wm/root_window_layout_manager.h" |
| 16 #include "base/bind.h" | 16 #include "base/bind.h" |
| 17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/synchronization/cancellation_flag.h" | 18 #include "base/synchronization/cancellation_flag.h" |
| 19 #include "base/threading/worker_pool.h" | 19 #include "base/threading/worker_pool.h" |
| 20 #include "content/public/browser/browser_thread.h" | 20 #include "content/public/browser/browser_thread.h" |
| 21 #include "grit/ash_wallpaper_resources.h" | |
| 21 #include "ui/aura/root_window.h" | 22 #include "ui/aura/root_window.h" |
| 22 #include "ui/aura/window.h" | 23 #include "ui/aura/window.h" |
| 23 #include "ui/base/resource/resource_bundle.h" | 24 #include "ui/base/resource/resource_bundle.h" |
| 24 #include "ui/compositor/layer.h" | 25 #include "ui/compositor/layer.h" |
| 25 #include "ui/gfx/rect.h" | 26 #include "ui/gfx/rect.h" |
| 26 #include "ui/gfx/image/image.h" | 27 #include "ui/gfx/image/image.h" |
| 27 #include "ui/views/widget/widget.h" | 28 #include "ui/views/widget/widget.h" |
| 28 | 29 |
| 29 using ash::internal::DesktopBackgroundWidgetController; | 30 using ash::internal::DesktopBackgroundWidgetController; |
| 30 using ash::internal::kAnimatingDesktopController; | 31 using ash::internal::kAnimatingDesktopController; |
| 31 using ash::internal::kDesktopController; | 32 using ash::internal::kDesktopController; |
| 32 using content::BrowserThread; | 33 using content::BrowserThread; |
| 33 | 34 |
| 34 namespace ash { | 35 namespace ash { |
| 35 namespace { | 36 namespace { |
| 36 | 37 |
| 37 const SkColor kTransparentColor = SkColorSetARGB(0x00, 0x00, 0x00, 0x00); | 38 const SkColor kTransparentColor = SkColorSetARGB(0x00, 0x00, 0x00, 0x00); |
| 38 | 39 |
| 39 internal::RootWindowLayoutManager* GetRootWindowLayoutManager( | 40 internal::RootWindowLayoutManager* GetRootWindowLayoutManager( |
| 40 aura::RootWindow* root_window) { | 41 aura::RootWindow* root_window) { |
| 41 return static_cast<internal::RootWindowLayoutManager*>( | 42 return static_cast<internal::RootWindowLayoutManager*>( |
| 42 root_window->layout_manager()); | 43 root_window->layout_manager()); |
| 43 } | 44 } |
| 44 } // namespace | 45 } // namespace |
| 45 | 46 |
| 47 #if defined(GOOGLE_CHROME_BUILD) | |
| 48 const WallpaperInfo kDefaultLargeWallpaper = | |
| 49 { IDR_AURA_WALLPAPERS_2_LANDSCAPE8_LARGE, CENTER_CROPPED }; | |
| 50 const WallpaperInfo kDefaultSmallWallpaper = | |
| 51 { IDR_AURA_WALLPAPERS_2_LANDSCAPE8_SMALL, CENTER }; | |
| 52 const WallpaperInfo kGuestLargeWallpaper = | |
| 53 { IDR_AURA_WALLPAPERS_2_LANDSCAPE7_LARGE, CENTER_CROPPED }; | |
| 54 const WallpaperInfo kGuestSmallWallpaper = | |
| 55 { IDR_AURA_WALLPAPERS_2_LANDSCAPE7_SMALL, CENTER }; | |
| 56 #else | |
| 57 const WallpaperInfo kDefaultLargeWallpaper = | |
| 58 { IDR_AURA_WALLPAPERS_5_GRADIENT5_LARGE, TILE }; | |
| 59 const WallpaperInfo kDefaultSmallWallpaper = | |
| 60 { IDR_AURA_WALLPAPERS_5_GRADIENT5_SMALL, TILE }; | |
| 61 const WallpaperInfo kGuestLargeWallpaper = kDefaultLargeWallpaper; | |
| 62 const WallpaperInfo kGuestSmallWallpaper = kDefaultSmallWallpaper; | |
| 63 #endif | |
| 64 | |
| 46 const int kSmallWallpaperMaxWidth = 1366; | 65 const int kSmallWallpaperMaxWidth = 1366; |
| 47 const int kSmallWallpaperMaxHeight = 800; | 66 const int kSmallWallpaperMaxHeight = 800; |
| 48 const int kLargeWallpaperMaxWidth = 2560; | 67 const int kLargeWallpaperMaxWidth = 2560; |
| 49 const int kLargeWallpaperMaxHeight = 1700; | 68 const int kLargeWallpaperMaxHeight = 1700; |
| 50 | 69 |
| 51 // Stores the current wallpaper data. | 70 // Stores the current wallpaper data. |
| 52 struct DesktopBackgroundController::WallpaperData { | 71 struct DesktopBackgroundController::WallpaperData { |
| 53 WallpaperData(int index, WallpaperResolution resolution) | 72 explicit WallpaperData(const WallpaperInfo& info) |
| 54 : is_default_wallpaper(true), | 73 : wallpaper_idr(info.idr), |
| 55 wallpaper_index(index), | 74 wallpaper_layout(info.layout), |
| 56 wallpaper_layout(GetWallpaperViewInfo(index, resolution).layout), | |
| 57 wallpaper_image(*(ui::ResourceBundle::GetSharedInstance().GetImageNamed( | 75 wallpaper_image(*(ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
| 58 GetWallpaperViewInfo(index, resolution).id).ToImageSkia())) { | 76 info.idr).ToImageSkia())) { |
| 59 } | 77 } |
| 60 WallpaperData(WallpaperLayout layout, const gfx::ImageSkia& image) | 78 WallpaperData(WallpaperLayout layout, const gfx::ImageSkia& image) |
| 61 : is_default_wallpaper(false), | 79 : wallpaper_idr(-1), |
| 62 wallpaper_index(-1), | |
| 63 wallpaper_layout(layout), | 80 wallpaper_layout(layout), |
| 64 wallpaper_image(image) { | 81 wallpaper_image(image) { |
| 65 } | 82 } |
| 66 const bool is_default_wallpaper; | 83 int wallpaper_idr; |
|
sky
2012/11/19 22:21:19
Can this use WallpaperInfo?
bshe
2012/11/20 00:33:59
Done.
| |
| 67 const int wallpaper_index; | |
| 68 const WallpaperLayout wallpaper_layout; | 84 const WallpaperLayout wallpaper_layout; |
| 69 const gfx::ImageSkia wallpaper_image; | 85 const gfx::ImageSkia wallpaper_image; |
| 70 }; | 86 }; |
| 71 | 87 |
| 72 // DesktopBackgroundController::WallpaperOperation wraps background wallpaper | 88 // DesktopBackgroundController::WallpaperOperation wraps background wallpaper |
| 73 // loading. | 89 // loading. |
| 74 class DesktopBackgroundController::WallpaperOperation | 90 class DesktopBackgroundController::WallpaperOperation |
|
sky
2012/11/19 22:21:19
If this loads, shouldn't the name be WallpaperLoad
bshe
2012/11/20 00:33:59
Done.
| |
| 75 : public base::RefCountedThreadSafe< | 91 : public base::RefCountedThreadSafe< |
| 76 DesktopBackgroundController::WallpaperOperation> { | 92 DesktopBackgroundController::WallpaperOperation> { |
| 77 public: | 93 public: |
| 78 WallpaperOperation(int index, WallpaperResolution resolution) | 94 explicit WallpaperOperation(const WallpaperInfo& info) |
| 79 : index_(index), | 95 : info_(info) { |
| 80 resolution_(resolution) { | |
| 81 } | 96 } |
| 82 | 97 |
| 83 static void Run(scoped_refptr<WallpaperOperation> wo) { | 98 static void Run(scoped_refptr<WallpaperOperation> wo) { |
| 84 wo->LoadingWallpaper(); | 99 wo->LoadingWallpaper(); |
|
sky
2012/11/19 22:21:19
Add DCHECK not on UI thread. Similarly naming this
bshe
2012/11/20 00:33:59
Done.
| |
| 85 } | 100 } |
| 86 | 101 |
| 87 void LoadingWallpaper() { | 102 void LoadingWallpaper() { |
|
sky
2012/11/19 22:21:19
Does this need to be public?
bshe
2012/11/20 00:33:59
Done.
| |
| 88 if (cancel_flag_.IsSet()) | 103 if (cancel_flag_.IsSet()) |
| 89 return; | 104 return; |
| 90 wallpaper_data_.reset(new WallpaperData(index_, resolution_)); | 105 wallpaper_data_.reset(new WallpaperData(info_)); |
| 91 } | 106 } |
| 92 | 107 |
| 93 void Cancel() { | 108 void Cancel() { |
| 94 cancel_flag_.Set(); | 109 cancel_flag_.Set(); |
| 95 } | 110 } |
| 96 | 111 |
| 97 int index() const { | 112 int idr() { |
|
sky
2012/11/19 22:21:19
how come you removed the const?
bshe
2012/11/20 00:33:59
Done.
| |
| 98 return index_; | 113 return info_.idr; |
| 99 } | 114 } |
| 100 | 115 |
| 101 WallpaperData* ReleaseWallpaperData() { | 116 WallpaperData* ReleaseWallpaperData() { |
| 102 return wallpaper_data_.release(); | 117 return wallpaper_data_.release(); |
| 103 } | 118 } |
| 104 | 119 |
| 105 private: | 120 private: |
| 106 friend class base::RefCountedThreadSafe< | 121 friend class base::RefCountedThreadSafe< |
| 107 DesktopBackgroundController::WallpaperOperation>; | 122 DesktopBackgroundController::WallpaperOperation>; |
| 108 | 123 |
| 109 ~WallpaperOperation() {} | 124 ~WallpaperOperation() {} |
| 110 | 125 |
| 111 base::CancellationFlag cancel_flag_; | 126 base::CancellationFlag cancel_flag_; |
| 112 | 127 |
| 113 scoped_ptr<WallpaperData> wallpaper_data_; | 128 scoped_ptr<WallpaperData> wallpaper_data_; |
| 114 | 129 |
| 115 const int index_; | 130 const WallpaperInfo info_; |
| 116 | |
| 117 const WallpaperResolution resolution_; | |
| 118 | 131 |
| 119 DISALLOW_COPY_AND_ASSIGN(WallpaperOperation); | 132 DISALLOW_COPY_AND_ASSIGN(WallpaperOperation); |
| 120 }; | 133 }; |
| 121 | 134 |
| 122 DesktopBackgroundController::DesktopBackgroundController() | 135 DesktopBackgroundController::DesktopBackgroundController() |
| 123 : locked_(false), | 136 : locked_(false), |
| 124 desktop_background_mode_(BACKGROUND_SOLID_COLOR), | 137 desktop_background_mode_(BACKGROUND_SOLID_COLOR), |
| 125 background_color_(kTransparentColor), | 138 background_color_(kTransparentColor), |
| 126 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 139 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
| 127 } | 140 } |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 151 return current_wallpaper_->wallpaper_layout; | 164 return current_wallpaper_->wallpaper_layout; |
| 152 return CENTER_CROPPED; | 165 return CENTER_CROPPED; |
| 153 } | 166 } |
| 154 | 167 |
| 155 gfx::ImageSkia DesktopBackgroundController::GetCurrentWallpaperImage() { | 168 gfx::ImageSkia DesktopBackgroundController::GetCurrentWallpaperImage() { |
| 156 if (desktop_background_mode_ != BACKGROUND_IMAGE) | 169 if (desktop_background_mode_ != BACKGROUND_IMAGE) |
| 157 return gfx::ImageSkia(); | 170 return gfx::ImageSkia(); |
| 158 return GetWallpaper(); | 171 return GetWallpaper(); |
| 159 } | 172 } |
| 160 | 173 |
| 174 int DesktopBackgroundController::GetWallpaperIDR() const { | |
| 175 if (wallpaper_op_.get()) | |
| 176 return wallpaper_op_->idr(); | |
| 177 else if (current_wallpaper_.get()) | |
| 178 return current_wallpaper_->wallpaper_idr; | |
| 179 else | |
| 180 return -1; | |
| 181 } | |
| 182 | |
| 161 void DesktopBackgroundController::OnRootWindowAdded( | 183 void DesktopBackgroundController::OnRootWindowAdded( |
| 162 aura::RootWindow* root_window) { | 184 aura::RootWindow* root_window) { |
| 163 // Handle resolution change for "built-in" images." | 185 // Handle resolution change for "built-in" images." |
| 164 if (BACKGROUND_IMAGE == desktop_background_mode_ && | 186 if (BACKGROUND_IMAGE == desktop_background_mode_ && |
| 165 current_wallpaper_.get()) { | 187 current_wallpaper_.get()) { |
| 166 gfx::Size root_window_size = root_window->GetHostSize(); | 188 gfx::Size root_window_size = root_window->GetHostSize(); |
| 167 // Loads a higher resolution wallpaper if new root window is larger than | 189 // Loads a higher resolution wallpaper if new root window is larger than |
| 168 // small screen. | 190 // small screen. |
| 169 if (kSmallWallpaperMaxWidth < root_window_size.width() || | 191 if (kSmallWallpaperMaxWidth < root_window_size.width() || |
| 170 kSmallWallpaperMaxHeight < root_window_size.height()) { | 192 kSmallWallpaperMaxHeight < root_window_size.height()) { |
| 171 if (current_wallpaper_->is_default_wallpaper) { | 193 current_wallpaper_.reset(NULL); |
| 172 ReloadDefaultWallpaper(); | 194 ash::Shell::GetInstance()->user_wallpaper_delegate()-> |
| 173 } else { | 195 UpdateWallpaper(); |
| 174 ash::Shell::GetInstance()->user_wallpaper_delegate()-> | |
| 175 UpdateWallpaper(); | |
| 176 } | |
| 177 } | 196 } |
| 178 } | 197 } |
| 179 | 198 |
| 180 InstallDesktopController(root_window); | 199 InstallDesktopController(root_window); |
| 181 } | 200 } |
| 182 | 201 |
| 183 void DesktopBackgroundController::CacheDefaultWallpaper(int index) { | 202 void DesktopBackgroundController::SetDefaultWallpaper(WallpaperInfo info) { |
| 184 DCHECK(index >= 0); | 203 DCHECK(GetWallpaperIDR() != info.idr); |
|
sky
2012/11/19 22:21:19
DCHECK_NE
How come this is a DCHECK? Isn't it poss
bshe
2012/11/20 00:33:59
I have moved the logic to prevent reloading same w
| |
| 185 | |
| 186 WallpaperResolution resolution = GetAppropriateResolution(); | |
| 187 scoped_refptr<WallpaperOperation> wallpaper_op = | |
| 188 new WallpaperOperation(index, resolution); | |
| 189 base::WorkerPool::PostTask( | |
| 190 FROM_HERE, | |
| 191 base::Bind(&WallpaperOperation::Run, wallpaper_op), | |
| 192 true); | |
| 193 } | |
| 194 | |
| 195 void DesktopBackgroundController::SetDefaultWallpaper(int index) { | |
| 196 // We should not change background when index is invalid. For instance, at | |
| 197 // login screen or stub_user login. | |
| 198 if (index == GetInvalidWallpaperIndex()) { | |
| 199 CreateEmptyWallpaper(); | |
| 200 return; | |
| 201 } else if (index == GetSolidColorIndex()) { | |
| 202 SetDesktopBackgroundSolidColorMode(kLoginWallpaperColor); | |
| 203 return; | |
| 204 } | |
| 205 | |
| 206 // Prevents loading of the same wallpaper as the currently loading/loaded | |
| 207 // one. | |
| 208 if ((wallpaper_op_.get() && wallpaper_op_->index() == index) || | |
| 209 (current_wallpaper_.get() && | |
| 210 current_wallpaper_->wallpaper_index == index)) { | |
| 211 return; | |
| 212 } | |
| 213 | 204 |
| 214 CancelPendingWallpaperOperation(); | 205 CancelPendingWallpaperOperation(); |
| 215 | 206 wallpaper_op_ = new WallpaperOperation(info); |
| 216 WallpaperResolution resolution = GetAppropriateResolution(); | |
| 217 | |
| 218 wallpaper_op_ = new WallpaperOperation(index, resolution); | |
| 219 base::WorkerPool::PostTaskAndReply( | 207 base::WorkerPool::PostTaskAndReply( |
| 220 FROM_HERE, | 208 FROM_HERE, |
| 221 base::Bind(&WallpaperOperation::Run, wallpaper_op_), | 209 base::Bind(&WallpaperOperation::Run, wallpaper_op_), |
| 222 base::Bind(&DesktopBackgroundController::OnWallpaperLoadCompleted, | 210 base::Bind(&DesktopBackgroundController::OnWallpaperLoadCompleted, |
| 223 weak_ptr_factory_.GetWeakPtr(), | 211 weak_ptr_factory_.GetWeakPtr(), |
| 224 wallpaper_op_), | 212 wallpaper_op_), |
| 225 true /* task_is_slow */); | 213 true /* task_is_slow */); |
| 226 } | 214 } |
| 227 | 215 |
| 228 void DesktopBackgroundController::ReloadDefaultWallpaper() { | |
| 229 int index = current_wallpaper_->wallpaper_index; | |
| 230 current_wallpaper_.reset(NULL); | |
| 231 SetDefaultWallpaper(index); | |
| 232 } | |
| 233 | |
| 234 void DesktopBackgroundController::SetCustomWallpaper( | 216 void DesktopBackgroundController::SetCustomWallpaper( |
| 235 const gfx::ImageSkia& wallpaper, | 217 const gfx::ImageSkia& wallpaper, |
| 236 WallpaperLayout layout) { | 218 WallpaperLayout layout) { |
| 237 CancelPendingWallpaperOperation(); | 219 CancelPendingWallpaperOperation(); |
| 238 if (current_wallpaper_.get() && | 220 if (current_wallpaper_.get() && |
| 239 current_wallpaper_->wallpaper_image.BackedBySameObjectAs(wallpaper)) { | 221 current_wallpaper_->wallpaper_image.BackedBySameObjectAs(wallpaper)) { |
| 240 return; | 222 return; |
| 241 } | 223 } |
| 242 | 224 |
| 243 current_wallpaper_.reset(new WallpaperData(layout, wallpaper)); | 225 current_wallpaper_.reset(new WallpaperData(layout, wallpaper)); |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 424 } | 406 } |
| 425 return moved; | 407 return moved; |
| 426 } | 408 } |
| 427 | 409 |
| 428 int DesktopBackgroundController::GetBackgroundContainerId(bool locked) { | 410 int DesktopBackgroundController::GetBackgroundContainerId(bool locked) { |
| 429 return locked ? internal::kShellWindowId_LockScreenBackgroundContainer : | 411 return locked ? internal::kShellWindowId_LockScreenBackgroundContainer : |
| 430 internal::kShellWindowId_DesktopBackgroundContainer; | 412 internal::kShellWindowId_DesktopBackgroundContainer; |
| 431 } | 413 } |
| 432 | 414 |
| 433 } // namespace ash | 415 } // namespace ash |
| OLD | NEW |