Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1183)

Unified Diff: ash/desktop_background/desktop_background_controller.cc

Issue 10810039: 2nd display should show the same background as login/lock screen: (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Merge with ToT Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}
}

Powered by Google App Engine
This is Rietveld 408576698