Chromium Code Reviews| Index: ash/desktop_background/desktop_background_controller.cc |
| diff --git a/ash/desktop_background/desktop_background_controller.cc b/ash/desktop_background/desktop_background_controller.cc |
| index 022ca0ba0c796d47753b6536e39bc8dac85d94e0..17e4c2610a2ca7a40d1921c8dedcd3eaee722930 100644 |
| --- a/ash/desktop_background/desktop_background_controller.cc |
| +++ b/ash/desktop_background/desktop_background_controller.cc |
| @@ -4,6 +4,7 @@ |
| #include "ash/desktop_background/desktop_background_controller.h" |
| +#include "ash/desktop_background/desktop_background_component.h" |
| #include "ash/desktop_background/desktop_background_view.h" |
| #include "ash/shell.h" |
| #include "ash/shell_factory.h" |
| @@ -18,6 +19,7 @@ |
| #include "ui/aura/window.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/compositor/layer.h" |
| +#include "ui/gfx/rect.h" |
| #include "ui/gfx/image/image.h" |
| #include "ui/views/widget/widget.h" |
| @@ -91,9 +93,16 @@ class DesktopBackgroundController::WallpaperOperation |
| }; |
| DesktopBackgroundController::DesktopBackgroundController() |
| - : desktop_background_mode_(BACKGROUND_IMAGE), |
| + : locked_(false), |
| + desktop_background_mode_(BACKGROUND_SOLID_COLOR), |
| background_color_(SK_ColorGRAY), |
| weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
| + //Install wallpaper component for all available windows. |
|
Nikita (slow)
2012/07/25 20:45:24
nit: insert space between // and comment text.
sky
2012/07/25 20:47:36
nit: space after //
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
|
| + Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); |
| + for (Shell::RootWindowList::iterator iter = root_windows.begin(); |
| + iter != root_windows.end(); ++iter) { |
| + InstallComponent(*iter); |
| + } |
| } |
| DesktopBackgroundController::~DesktopBackgroundController() { |
| @@ -120,27 +129,16 @@ SkBitmap DesktopBackgroundController::GetCurrentWallpaperImage() { |
| void DesktopBackgroundController::OnRootWindowAdded( |
| aura::RootWindow* root_window) { |
| - switch (desktop_background_mode_) { |
| - case BACKGROUND_IMAGE: |
| - if (current_wallpaper_.get()) { |
| - SetDesktopBackgroundImage(root_window); |
| - } else { |
| - internal::CreateDesktopBackground(root_window); |
| - } |
| - break; |
| - case BACKGROUND_SOLID_COLOR: |
| - SetDesktopBackgroundSolidColorMode(background_color_); |
| - break; |
| - } |
| + InstallComponent(root_window); |
| } |
| void DesktopBackgroundController::SetDefaultWallpaper(int index) { |
| // We should not change background when index is invalid. For instance, at |
| // login screen or stub_user login. |
| - if (index == ash::GetInvalidWallpaperIndex()) { |
| + if (index == GetInvalidWallpaperIndex()) { |
| CreateEmptyWallpaper(); |
| return; |
| - } else if (index == ash::GetSolidColorIndex()) { |
| + } else if (index == GetSolidColorIndex()) { |
| SetDesktopBackgroundSolidColorMode(kLoginWallpaperColor); |
| return; |
| } |
| @@ -165,8 +163,7 @@ void DesktopBackgroundController::SetCustomWallpaper( |
| WallpaperLayout layout) { |
| CancelPendingWallpaperOperation(); |
| current_wallpaper_.reset(new WallpaperData(layout, wallpaper)); |
| - desktop_background_mode_ = BACKGROUND_IMAGE; |
| - UpdateDesktopBackgroundImageMode(); |
| + SetDesktopBackgroundImageMode(); |
| } |
| void DesktopBackgroundController::CancelPendingWallpaperOperation() { |
| @@ -178,66 +175,146 @@ void DesktopBackgroundController::CancelPendingWallpaperOperation() { |
| weak_ptr_factory_.InvalidateWeakPtrs(); |
| } |
| +void DesktopBackgroundController::OnWallpaperLoadCompleted( |
| + scoped_refptr<WallpaperOperation> wo) { |
| + current_wallpaper_.reset(wo->ReleaseWallpaperData()); |
| + |
| + SetDesktopBackgroundImageMode(); |
| + |
| + DCHECK(wo.get() == wallpaper_op_.get()); |
| + wallpaper_op_ = NULL; |
| +} |
| + |
| +void DesktopBackgroundController::CreateEmptyWallpaper() { |
| + current_wallpaper_.reset(NULL); |
| + SetDesktopBackgroundImageMode(); |
| +} |
| + |
| + |
| +void DesktopBackgroundController::InstallComponent( |
| + aura::RootWindow* root_window) { |
| + internal::DesktopBackgroundComponent* component = NULL; |
| + |
| + int container_id = locked_ ? |
| + internal::kShellWindowId_LockScreenBackgroundContainer : |
| + internal::kShellWindowId_DesktopBackgroundContainer; |
| + |
| + switch (desktop_background_mode_) { |
| + case BACKGROUND_IMAGE: { |
| + views::Widget* widget = internal::CreateDesktopBackground(root_window, |
| + container_id); |
|
Nikita (slow)
2012/07/25 20:45:24
nit: indentation is off
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
|
| + component = new internal::DesktopBackgroundComponent(widget); |
| + break; |
| + } |
| + case BACKGROUND_SOLID_COLOR: { |
| + ui::Layer* layer = SetColorLayerForContainer(background_color_, |
| + root_window, |
|
Nikita (slow)
2012/07/25 20:45:24
nit: indentation
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
|
| + container_id); |
| + component = new internal::DesktopBackgroundComponent(layer); |
| + break; |
| + } |
| + } |
|
Nikita (slow)
2012/07/25 20:45:24
default:
NOTREACHED();
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
|
| + root_window->SetProperty(internal::kWindowDesktopComponent, component); |
| +} |
| + |
| +ui::Layer* DesktopBackgroundController::SetColorLayerForContainer( |
| + SkColor color, |
| + aura::RootWindow* root_window, |
| + int container_id) { |
| + ui::Layer* background_layer = new ui::Layer(ui::LAYER_SOLID_COLOR); |
|
Nikita (slow)
2012/07/25 20:45:24
Indentation is off.
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
|
| + background_layer->SetColor(color); |
| + |
| + Shell::GetContainer(root_window,container_id)-> |
| + layer()->Add(background_layer); |
| + return background_layer; |
| +} |
| + |
| void DesktopBackgroundController::SetDesktopBackgroundSolidColorMode( |
| SkColor color) { |
| - // Set a solid black background. |
| - // TODO(derat): Remove this in favor of having the compositor only clear the |
| - // viewport when there are regions not covered by a layer: |
| - // http://crbug.com/113445 |
| - current_wallpaper_.reset(NULL); |
| background_color_ = color; |
| - desktop_background_mode_ = BACKGROUND_SOLID_COLOR; |
| + if (desktop_background_mode_ != BACKGROUND_SOLID_COLOR) { |
| + desktop_background_mode_ = BACKGROUND_SOLID_COLOR; |
| + Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); |
|
Nikita (slow)
2012/07/25 20:45:24
237-240 could be extracted to a separate function.
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
|
| + for (Shell::RootWindowList::iterator iter = root_windows.begin(); |
| + iter != root_windows.end(); ++iter) |
|
Nikita (slow)
2012/07/25 20:45:24
nit: add {}
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
|
| + InstallComponent(*iter); |
| + return; |
| + } |
| + |
| Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); |
| for (Shell::RootWindowList::iterator iter = root_windows.begin(); |
| - iter != root_windows.end(); ++iter) { |
| - ui::Layer* background_layer = new ui::Layer(ui::LAYER_SOLID_COLOR); |
| - background_layer->SetColor(color); |
| + iter != root_windows.end(); ++iter) { |
|
Nikita (slow)
2012/07/25 20:45:24
nit: Fix indent.
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
|
| aura::RootWindow* root_window = *iter; |
| - Shell::GetContainer( |
| - root_window, |
| - internal::kShellWindowId_DesktopBackgroundContainer)-> |
| - layer()->Add(background_layer); |
| - GetRootWindowLayoutManager(root_window)->SetBackgroundLayer( |
| - background_layer); |
| - GetRootWindowLayoutManager(root_window)->SetBackgroundWidget(NULL); |
| + internal::DesktopBackgroundComponent* component = root_window-> |
| + GetProperty(internal::kWindowDesktopComponent); |
| + DCHECK(component); |
| + DCHECK(component->layer()); |
| + component->layer()->SetColor(background_color_ ); |
| } |
| } |
| -void DesktopBackgroundController::SetDesktopBackgroundImage( |
| - aura::RootWindow* root_window) { |
| - GetRootWindowLayoutManager(root_window)->SetBackgroundLayer(NULL); |
| - if (current_wallpaper_.get() && |
| - !current_wallpaper_->wallpaper_image.empty()) |
| - internal::CreateDesktopBackground(root_window); |
| -} |
| -void DesktopBackgroundController::UpdateDesktopBackgroundImageMode() { |
| - Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); |
| +void DesktopBackgroundController::SetDesktopBackgroundImageMode() { |
| + if (desktop_background_mode_ != BACKGROUND_IMAGE) { |
| + desktop_background_mode_ = BACKGROUND_IMAGE; |
| + Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); |
| + for (Shell::RootWindowList::iterator iter = root_windows.begin(); |
| + iter != root_windows.end(); ++iter) |
|
Nikita (slow)
2012/07/25 20:45:24
nit: Add {}
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
|
| + InstallComponent(*iter); |
| + return; |
| + } |
| + Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); |
| for (Shell::RootWindowList::iterator iter = root_windows.begin(); |
| - iter != root_windows.end(); ++iter) { |
| - SetDesktopBackgroundImage(*iter); |
| + iter != root_windows.end(); ++iter) { |
| + aura::RootWindow* root_window = *iter; |
| + internal::DesktopBackgroundComponent* component = root_window-> |
| + GetProperty(internal::kWindowDesktopComponent); |
| + DCHECK(component); |
| + DCHECK(component->widget()); |
| + aura::Window* window = component->widget()->GetNativeView(); |
| + gfx::Rect bounds = window->bounds(); |
| + window->SchedulePaintInRect(gfx::Rect(0, 0, |
| + bounds.width(), bounds.height())); |
| } |
| - desktop_background_mode_ = BACKGROUND_IMAGE; |
| + |
|
Nikita (slow)
2012/07/25 20:45:24
nit: nuke empty line
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
|
| } |
| -void DesktopBackgroundController::OnWallpaperLoadCompleted( |
| - scoped_refptr<WallpaperOperation> wo) { |
| - current_wallpaper_.reset(wo->ReleaseWallpaperData()); |
| - UpdateDesktopBackgroundImageMode(); |
| - DCHECK(wo.get() == wallpaper_op_.get()); |
| - wallpaper_op_ = NULL; |
| +void DesktopBackgroundController::CreateLockScreenDesktops() { |
|
sky
2012/07/25 20:47:36
Position should match that of header.
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Done.
|
| + if (locked_) |
| + return; |
| + locked_ = true; |
|
sky
2012/07/25 20:47:36
Why do we need locked_ cached in here?
Denis Kuznetsov (DE-MUC)
2012/07/26 13:51:13
Because we want to add ui components to correct co
|
| + |
| + Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); |
| + for (Shell::RootWindowList::iterator iter = root_windows.begin(); |
| + iter != root_windows.end(); ++iter) { |
| + aura::RootWindow* root_window = *iter; |
| + internal::DesktopBackgroundComponent* component = root_window-> |
| + GetProperty(internal::kWindowDesktopComponent); |
| + DCHECK(component); |
| + component->Reparent(root_window, |
| + internal::kShellWindowId_DesktopBackgroundContainer, |
| + internal::kShellWindowId_LockScreenBackgroundContainer); |
| + } |
| } |
| -void DesktopBackgroundController::CreateEmptyWallpaper() { |
| - current_wallpaper_.reset(NULL); |
| - desktop_background_mode_ = BACKGROUND_IMAGE; |
| +void DesktopBackgroundController::RemoveLockScreenDesktops() { |
| + if (!locked_) |
| + return; |
| + locked_ = false; |
| + |
| Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); |
| for (Shell::RootWindowList::iterator iter = root_windows.begin(); |
| - iter != root_windows.end(); ++iter) { |
| - internal::CreateDesktopBackground(*iter); |
| + iter != root_windows.end(); ++iter) { |
| + aura::RootWindow* root_window = *iter; |
| + internal::DesktopBackgroundComponent* component = root_window-> |
| + GetProperty(internal::kWindowDesktopComponent); |
| + DCHECK(component); |
| + component->Reparent(root_window, |
| + internal::kShellWindowId_LockScreenBackgroundContainer, |
| + internal::kShellWindowId_DesktopBackgroundContainer); |
| } |
| } |