diff options
-rw-r--r-- | ash/desktop_background/desktop_background_controller.cc | 2 | ||||
-rw-r--r-- | ash/desktop_background/desktop_background_view.cc | 2 | ||||
-rw-r--r-- | ash/root_window_controller.cc | 22 | ||||
-rw-r--r-- | ash/root_window_controller.h | 16 | ||||
-rw-r--r-- | ash/shell.cc | 2 | ||||
-rw-r--r-- | ash/shell/shell_delegate_impl.cc | 4 | ||||
-rw-r--r-- | ash/shell/shell_delegate_impl.h | 1 | ||||
-rw-r--r-- | ash/shell_delegate.h | 5 | ||||
-rw-r--r-- | ash/shell_window_ids.h | 7 | ||||
-rw-r--r-- | ash/test/test_shell_delegate.cc | 4 | ||||
-rw-r--r-- | ash/test/test_shell_delegate.h | 1 | ||||
-rw-r--r-- | ash/wm/workspace/system_background_controller.cc | 13 | ||||
-rw-r--r-- | ash/wm/workspace/system_background_controller.h | 7 | ||||
-rw-r--r-- | ash/wm/workspace/workspace_manager2.cc | 20 | ||||
-rw-r--r-- | ash/wm/workspace/workspace_manager2.h | 12 | ||||
-rw-r--r-- | chrome/browser/ui/ash/chrome_shell_delegate.cc | 8 | ||||
-rw-r--r-- | chrome/browser/ui/ash/chrome_shell_delegate.h | 1 |
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; |