summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ash/desktop_background/desktop_background_controller.cc2
-rw-r--r--ash/desktop_background/desktop_background_view.cc2
-rw-r--r--ash/root_window_controller.cc22
-rw-r--r--ash/root_window_controller.h16
-rw-r--r--ash/shell.cc2
-rw-r--r--ash/shell/shell_delegate_impl.cc4
-rw-r--r--ash/shell/shell_delegate_impl.h1
-rw-r--r--ash/shell_delegate.h5
-rw-r--r--ash/shell_window_ids.h7
-rw-r--r--ash/test/test_shell_delegate.cc4
-rw-r--r--ash/test/test_shell_delegate.h1
-rw-r--r--ash/wm/workspace/system_background_controller.cc13
-rw-r--r--ash/wm/workspace/system_background_controller.h7
-rw-r--r--ash/wm/workspace/workspace_manager2.cc20
-rw-r--r--ash/wm/workspace/workspace_manager2.h12
-rw-r--r--chrome/browser/ui/ash/chrome_shell_delegate.cc8
-rw-r--r--chrome/browser/ui/ash/chrome_shell_delegate.h1
17 files changed, 88 insertions, 39 deletions
diff --git a/ash/desktop_background/desktop_background_controller.cc b/ash/desktop_background/desktop_background_controller.cc
index 6f4d11b..4d084df 100644
--- a/ash/desktop_background/desktop_background_controller.cc
+++ b/ash/desktop_background/desktop_background_controller.cc
@@ -6,6 +6,7 @@
#include "ash/desktop_background/desktop_background_view.h"
#include "ash/desktop_background/desktop_background_widget_controller.h"
+#include "ash/root_window_controller.h"
#include "ash/shell.h"
#include "ash/shell_factory.h"
#include "ash/shell_window_ids.h"
@@ -277,6 +278,7 @@ void DesktopBackgroundController::OnWallpaperLoadCompleted(
void DesktopBackgroundController::NotifyAnimationFinished() {
Shell* shell = Shell::GetInstance();
+ shell->GetPrimaryRootWindowController()->HandleDesktopBackgroundVisible();
shell->user_wallpaper_delegate()->OnWallpaperAnimationFinished();
}
diff --git a/ash/desktop_background/desktop_background_view.cc b/ash/desktop_background/desktop_background_view.cc
index 74dbb72..a787882 100644
--- a/ash/desktop_background/desktop_background_view.cc
+++ b/ash/desktop_background/desktop_background_view.cc
@@ -9,6 +9,7 @@
#include "ash/ash_export.h"
#include "ash/desktop_background/desktop_background_controller.h"
#include "ash/desktop_background/desktop_background_widget_controller.h"
+#include "ash/root_window_controller.h"
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
#include "ash/wm/window_animations.h"
@@ -47,6 +48,7 @@ class ShowWallpaperAnimationObserver : public ui::ImplicitAnimationObserver,
// Overridden from ui::ImplicitAnimationObserver:
virtual void OnImplicitAnimationsCompleted() OVERRIDE {
ash::Shell* shell = ash::Shell::GetInstance();
+ shell->GetPrimaryRootWindowController()->HandleDesktopBackgroundVisible();
shell->user_wallpaper_delegate()->OnWallpaperAnimationFinished();
// Only removes old component when wallpaper animation finished. If we
// remove the old one too early, there will be a white flash during
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index ee56378bf..532d60a 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -21,6 +21,7 @@
#include "ash/wm/toplevel_window_event_handler.h"
#include "ash/wm/visibility_controller.h"
#include "ash/wm/window_properties.h"
+#include "ash/wm/workspace/system_background_controller.h"
#include "ash/wm/workspace_controller.h"
#include "ui/aura/client/activation_client.h"
#include "ui/aura/client/aura_constants.h"
@@ -37,6 +38,12 @@
namespace ash {
namespace {
+#if defined(OS_CHROMEOS)
+// Color initially used for the system background after the system has first
+// booted.
+const SkColor kBootSystemBackgroundColor = 0xFFFEFEFE;
+#endif
+
// Creates a new window for use as a container.
aura::Window* CreateContainer(int window_id,
const char* name,
@@ -189,6 +196,21 @@ void RootWindowController::CreateContainers() {
CreateContainersInRootWindow(root_window_.get());
}
+void RootWindowController::CreateSystemBackground(
+ bool is_first_run_after_boot) {
+ SkColor color = SK_ColorBLACK;
+#if defined(OS_CHROMEOS)
+ if (is_first_run_after_boot)
+ color = kBootSystemBackgroundColor;
+#endif
+ background_.reset(new SystemBackgroundController(root_window_.get(), color));
+}
+
+void RootWindowController::HandleDesktopBackgroundVisible() {
+ if (background_.get())
+ background_->SetColor(SK_ColorBLACK);
+}
+
void RootWindowController::CloseChildWindows() {
// Close background widget first as it depends on tooltip.
root_window_->SetProperty(kWindowDesktopComponent,
diff --git a/ash/root_window_controller.h b/ash/root_window_controller.h
index 27f396d..29f9c04 100644
--- a/ash/root_window_controller.h
+++ b/ash/root_window_controller.h
@@ -27,6 +27,7 @@ namespace internal {
class EventClientImpl;
class RootWindowLayoutManager;
class ScreenDimmer;
+class SystemBackgroundController;
class WorkspaceController;
// This class maintains the per root window state for ash. This class
@@ -57,8 +58,15 @@ class RootWindowController {
aura::Window* GetContainer(int container_id);
- void CreateContainers();
void InitLayoutManagers();
+ void CreateContainers();
+
+ // Initializes |background_|. |is_first_run_after_boot| determines the
+ // background's initial color.
+ void CreateSystemBackground(bool is_first_run_after_boot);
+
+ // Updates |background_| to be black after the desktop background is visible.
+ void HandleDesktopBackgroundVisible();
// Deletes associated objects and clears the state, but doesn't delete
// the root window yet. This is used to delete a secondary displays'
@@ -83,6 +91,12 @@ class RootWindowController {
scoped_ptr<aura::RootWindow> root_window_;
internal::RootWindowLayoutManager* root_window_layout_;
+ // A background layer that's displayed beneath all other layers. Without
+ // this, portions of the root window that aren't covered by layers will be
+ // painted white; this can show up if e.g. it takes a long time to decode the
+ // desktop background image when displaying the login screen.
+ scoped_ptr<SystemBackgroundController> background_;
+
// An event filter that pre-handles all key events to send them to an IME.
scoped_ptr<internal::EventClientImpl> event_client_;
scoped_ptr<internal::ScreenDimmer> screen_dimmer_;
diff --git a/ash/shell.cc b/ash/shell.cc
index bca3358..560e5e8 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -411,6 +411,8 @@ void Shell::Init() {
internal::RootWindowController* root_window_controller =
new internal::RootWindowController(root_window);
root_window_controller->CreateContainers();
+ root_window_controller->CreateSystemBackground(
+ delegate_.get() ? delegate_->IsFirstRunAfterBoot() : false);
CommandLine* command_line = CommandLine::ForCurrentProcess();
diff --git a/ash/shell/shell_delegate_impl.cc b/ash/shell/shell_delegate_impl.cc
index 948528e..ca2696d 100644
--- a/ash/shell/shell_delegate_impl.cc
+++ b/ash/shell/shell_delegate_impl.cc
@@ -39,6 +39,10 @@ bool ShellDelegateImpl::IsSessionStarted() {
return true;
}
+bool ShellDelegateImpl::IsFirstRunAfterBoot() {
+ return false;
+}
+
void ShellDelegateImpl::LockScreen() {
ash::shell::CreateLockScreen();
locked_ = true;
diff --git a/ash/shell/shell_delegate_impl.h b/ash/shell/shell_delegate_impl.h
index 82e5347..a8a8944 100644
--- a/ash/shell/shell_delegate_impl.h
+++ b/ash/shell/shell_delegate_impl.h
@@ -23,6 +23,7 @@ class ShellDelegateImpl : public ash::ShellDelegate {
virtual bool IsUserLoggedIn() OVERRIDE;
virtual bool IsSessionStarted() OVERRIDE;
+ virtual bool IsFirstRunAfterBoot() OVERRIDE;
virtual void LockScreen() OVERRIDE;
virtual void UnlockScreen() OVERRIDE;
virtual bool IsScreenLocked() const OVERRIDE;
diff --git a/ash/shell_delegate.h b/ash/shell_delegate.h
index c095013..92ec386 100644
--- a/ash/shell_delegate.h
+++ b/ash/shell_delegate.h
@@ -64,6 +64,11 @@ class ASH_EXPORT ShellDelegate {
// Returns true if we're logged in and browser has been started
virtual bool IsSessionStarted() = 0;
+ // Returns true if this is the first time that the shell has been run after
+ // the system has booted. false is returned after the shell has been
+ // restarted, typically due to logging in as a guest or logging out.
+ virtual bool IsFirstRunAfterBoot() = 0;
+
// Invoked when a user locks the screen.
virtual void LockScreen() = 0;
diff --git a/ash/shell_window_ids.h b/ash/shell_window_ids.h
index 347f3d8..f4aca62 100644
--- a/ash/shell_window_ids.h
+++ b/ash/shell_window_ids.h
@@ -34,9 +34,10 @@ const int kShellWindowId_LockScreenRelatedContainersContainer = 2;
const int kShellWindowId_UnparentedControlContainer = 3;
// System level background. Sits beneach the desktop background and is only
-// visible when in a workspace other than the desktop. When switching from the
-// desktop workspace to to another workspace the desktop background scales
-// slightly. This exposes the system level background beneath it.
+// visible when the desktop background has not yet been loaded or a workspace
+// other than the desktop is being displayed. When switching from the desktop
+// workspace to to another workspace the desktop background scales slightly.
+// This exposes the system level background beneath it.
const int kShellWindowId_SystemBackgroundContainer = 4;
// The desktop background window.
diff --git a/ash/test/test_shell_delegate.cc b/ash/test/test_shell_delegate.cc
index e690c16..0526b85 100644
--- a/ash/test/test_shell_delegate.cc
+++ b/ash/test/test_shell_delegate.cc
@@ -32,6 +32,10 @@ bool TestShellDelegate::IsSessionStarted() {
return true;
}
+bool TestShellDelegate::IsFirstRunAfterBoot() {
+ return false;
+}
+
void TestShellDelegate::LockScreen() {
locked_ = true;
}
diff --git a/ash/test/test_shell_delegate.h b/ash/test/test_shell_delegate.h
index bd41219..f815d18 100644
--- a/ash/test/test_shell_delegate.h
+++ b/ash/test/test_shell_delegate.h
@@ -20,6 +20,7 @@ class TestShellDelegate : public ShellDelegate {
// Overridden from ShellDelegate:
virtual bool IsUserLoggedIn() OVERRIDE;
virtual bool IsSessionStarted() OVERRIDE;
+ virtual bool IsFirstRunAfterBoot() OVERRIDE;
virtual void LockScreen() OVERRIDE;
virtual void UnlockScreen() OVERRIDE;
virtual bool IsScreenLocked() const OVERRIDE;
diff --git a/ash/wm/workspace/system_background_controller.cc b/ash/wm/workspace/system_background_controller.cc
index 728e3e1..363a305 100644
--- a/ash/wm/workspace/system_background_controller.cc
+++ b/ash/wm/workspace/system_background_controller.cc
@@ -5,6 +5,7 @@
#include "ash/wm/workspace/system_background_controller.h"
#include "ash/shell_window_ids.h"
+#include "ui/aura/client/aura_constants.h"
#include "ui/aura/root_window.h"
#include "ui/gfx/canvas.h"
#include "ui/views/widget/widget.h"
@@ -49,7 +50,8 @@ views::View* SystemBackgroundController::View::GetContentsView() {
return this;
}
-SystemBackgroundController::SystemBackgroundController(aura::RootWindow* root)
+SystemBackgroundController::SystemBackgroundController(aura::RootWindow* root,
+ SkColor color)
: ALLOW_THIS_IN_INITIALIZER_LIST(view_(new View(this))) {
views::Widget* widget = new views::Widget;
views::Widget::InitParams params(
@@ -62,7 +64,9 @@ SystemBackgroundController::SystemBackgroundController(aura::RootWindow* root)
// flicker.
params.layer_type = ui::LAYER_SOLID_COLOR;
widget->Init(params);
- widget->GetNativeView()->layer()->SetColor(SK_ColorBLACK);
+ widget->GetNativeView()->SetProperty(aura::client::kAnimationsDisabledKey,
+ true);
+ widget->GetNativeView()->layer()->SetColor(color);
widget->SetBounds(params.parent->bounds());
widget->Show();
widget->GetNativeView()->SetName("SystemBackground");
@@ -73,5 +77,10 @@ SystemBackgroundController::~SystemBackgroundController() {
view_->Close();
}
+void SystemBackgroundController::SetColor(SkColor color) {
+ if (view_)
+ view_->GetWidget()->GetNativeView()->layer()->SetColor(color);
+}
+
} // namespace internal
} // namespace ash
diff --git a/ash/wm/workspace/system_background_controller.h b/ash/wm/workspace/system_background_controller.h
index ca78ab8..4b84fc0 100644
--- a/ash/wm/workspace/system_background_controller.h
+++ b/ash/wm/workspace/system_background_controller.h
@@ -8,6 +8,8 @@
#include "ash/ash_export.h"
#include "base/basictypes.h"
+typedef unsigned int SkColor;
+
namespace aura {
class RootWindow;
};
@@ -20,9 +22,12 @@ namespace internal {
// level background.
class ASH_EXPORT SystemBackgroundController {
public:
- explicit SystemBackgroundController(aura::RootWindow* root);
+ SystemBackgroundController(aura::RootWindow* root, SkColor color);
~SystemBackgroundController();
+ // Changes the background color.
+ void SetColor(SkColor color);
+
private:
class View;
diff --git a/ash/wm/workspace/workspace_manager2.cc b/ash/wm/workspace/workspace_manager2.cc
index 075815d..805dd18 100644
--- a/ash/wm/workspace/workspace_manager2.cc
+++ b/ash/wm/workspace/workspace_manager2.cc
@@ -16,7 +16,6 @@
#include "ash/wm/window_animations.h"
#include "ash/wm/window_properties.h"
#include "ash/wm/window_util.h"
-#include "ash/wm/workspace/system_background_controller.h"
#include "ash/wm/workspace/workspace_layout_manager2.h"
#include "ash/wm/workspace/workspace2.h"
#include "base/auto_reset.h"
@@ -331,21 +330,6 @@ void WorkspaceManager2::SetActiveWorkspace(Workspace2* workspace,
contents_view_->StackChildAtTop(last_active->window());
}
- destroy_background_timer_.Stop();
- if (active_workspace_ == desktop_workspace()) {
- base::TimeDelta delay(GetSystemBackgroundDestroyDuration());
- if (ui::LayerAnimator::slow_animation_mode())
- delay *= ui::LayerAnimator::slow_animation_scale_factor();
- // Delay an extra 100ms to make sure everything settles down before
- // destroying the background.
- delay += base::TimeDelta::FromMilliseconds(100);
- destroy_background_timer_.Start(
- FROM_HERE, delay, this, &WorkspaceManager2::DestroySystemBackground);
- } else if (!background_controller_.get()) {
- background_controller_.reset(new SystemBackgroundController(
- contents_view_->GetRootWindow()));
- }
-
UpdateShelfVisibility();
if (animate_type != ANIMATE_NONE) {
@@ -456,10 +440,6 @@ void WorkspaceManager2::ScheduleDelete(Workspace2* workspace) {
&WorkspaceManager2::ProcessDeletion);
}
-void WorkspaceManager2::DestroySystemBackground() {
- background_controller_.reset();
-}
-
void WorkspaceManager2::SetUnminimizingWorkspace(Workspace2* workspace) {
// The normal sequence of unminimizing a window is: Show() the window, which
// triggers changing the kShowStateKey to NORMAL and lastly the window is made
diff --git a/ash/wm/workspace/workspace_manager2.h b/ash/wm/workspace/workspace_manager2.h
index 8a9b9db..1cd1b0c 100644
--- a/ash/wm/workspace/workspace_manager2.h
+++ b/ash/wm/workspace/workspace_manager2.h
@@ -36,7 +36,6 @@ namespace ash {
namespace internal {
class ShelfLayoutManager;
-class SystemBackgroundController;
class WorkspaceLayoutManager2;
class WorkspaceManagerTest2;
class Workspace2;
@@ -139,9 +138,6 @@ class ASH_EXPORT WorkspaceManager2
// any layers.
void ProcessDeletion();
- // Deletes |background_controller_|. Called from |destroy_background_timer_|.
- void DestroySystemBackground();
-
// Sets |unminimizing_workspace_| to |workspace|.
void SetUnminimizingWorkspace(Workspace2* workspace);
@@ -198,14 +194,6 @@ class ASH_EXPORT WorkspaceManager2
// See comments in SetUnminimizingWorkspace() for details.
base::WeakPtrFactory<WorkspaceManager2> clear_unminimizing_workspace_factory_;
- // Used to show the system level background. Non-null when the background is
- // visible.
- scoped_ptr<SystemBackgroundController> background_controller_;
-
- // Timer used to destroy the background. We wait to destroy until animations
- // complete.
- base::OneShotTimer<WorkspaceManager2> destroy_background_timer_;
-
// See comments in SetUnminimizingWorkspace() for details.
Workspace2* unminimizing_workspace_;
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.cc b/chrome/browser/ui/ash/chrome_shell_delegate.cc
index 52089d2..f9ca572 100644
--- a/chrome/browser/ui/ash/chrome_shell_delegate.cc
+++ b/chrome/browser/ui/ash/chrome_shell_delegate.cc
@@ -119,6 +119,14 @@ bool ChromeShellDelegate::IsSessionStarted() {
#endif
}
+bool ChromeShellDelegate::IsFirstRunAfterBoot() {
+#if defined(OS_CHROMEOS)
+ return CommandLine::ForCurrentProcess()->HasSwitch(switches::kFirstBoot);
+#else
+ return false;
+#endif
+}
+
void ChromeShellDelegate::LockScreen() {
#if defined(OS_CHROMEOS)
if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kGuestSession) &&
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.h b/chrome/browser/ui/ash/chrome_shell_delegate.h
index ff627ca..4f533d8 100644
--- a/chrome/browser/ui/ash/chrome_shell_delegate.h
+++ b/chrome/browser/ui/ash/chrome_shell_delegate.h
@@ -36,6 +36,7 @@ class ChromeShellDelegate : public ash::ShellDelegate,
// ash::ShellDelegate overrides;
virtual bool IsUserLoggedIn() OVERRIDE;
virtual bool IsSessionStarted() OVERRIDE;
+ virtual bool IsFirstRunAfterBoot() OVERRIDE;
virtual void LockScreen() OVERRIDE;
virtual void UnlockScreen() OVERRIDE;
virtual bool IsScreenLocked() const OVERRIDE;