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); |
} |
} |