diff options
Diffstat (limited to 'chromium/ash/desktop_background/desktop_background_controller.h')
-rw-r--r-- | chromium/ash/desktop_background/desktop_background_controller.h | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/chromium/ash/desktop_background/desktop_background_controller.h b/chromium/ash/desktop_background/desktop_background_controller.h new file mode 100644 index 00000000000..afdc2dc52fc --- /dev/null +++ b/chromium/ash/desktop_background/desktop_background_controller.h @@ -0,0 +1,214 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_DESKTOP_BACKGROUND_DESKTOP_BACKGROUND_CONTROLLER_H_ +#define ASH_DESKTOP_BACKGROUND_DESKTOP_BACKGROUND_CONTROLLER_H_ + +#include "ash/ash_export.h" +#include "base/basictypes.h" +#include "base/files/file_path.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "base/observer_list.h" +#include "ui/aura/window.h" +#include "ui/compositor/layer.h" +#include "ui/gfx/image/image_skia.h" + +typedef unsigned int SkColor; + +class CommandLine; + +namespace aura { +class RootWindow; +} + +namespace ash { +namespace internal { +class DesktopBackgroundControllerTest; +} // namespace internal + +enum WallpaperLayout { + // Center the wallpaper on the desktop without scaling it. The wallpaper + // may be cropped. + WALLPAPER_LAYOUT_CENTER, + // Scale the wallpaper (while preserving its aspect ratio) to cover the + // desktop; the wallpaper may be cropped. + WALLPAPER_LAYOUT_CENTER_CROPPED, + // Scale the wallpaper (without preserving its aspect ratio) to match the + // desktop's size. + WALLPAPER_LAYOUT_STRETCH, + // Tile the wallpaper over the background without scaling it. + WALLPAPER_LAYOUT_TILE, +}; + +enum WallpaperResolution { + WALLPAPER_RESOLUTION_LARGE, + WALLPAPER_RESOLUTION_SMALL +}; + +const SkColor kLoginWallpaperColor = 0xFEFEFE; + +// The width and height of small/large resolution wallpaper. When screen size is +// smaller than |kSmallWallpaperMaxWidth| and |kSmallWallpaperMaxHeight|, the +// small resolution wallpaper should be used. Otherwise, uses the large +// resolution wallpaper. +ASH_EXPORT extern const int kSmallWallpaperMaxWidth; +ASH_EXPORT extern const int kSmallWallpaperMaxHeight; +ASH_EXPORT extern const int kLargeWallpaperMaxWidth; +ASH_EXPORT extern const int kLargeWallpaperMaxHeight; + +// The width and heigh of wallpaper thumbnails. +ASH_EXPORT extern const int kWallpaperThumbnailWidth; +ASH_EXPORT extern const int kWallpaperThumbnailHeight; + +class DesktopBackgroundControllerObserver; +class WallpaperResizer; + +// Loads selected desktop wallpaper from file system asynchronously and updates +// background layer if loaded successfully. +class ASH_EXPORT DesktopBackgroundController { + public: + enum BackgroundMode { + BACKGROUND_NONE, + BACKGROUND_IMAGE, + BACKGROUND_SOLID_COLOR + }; + + DesktopBackgroundController(); + virtual ~DesktopBackgroundController(); + + BackgroundMode desktop_background_mode() const { + return desktop_background_mode_; + } + + void set_command_line_for_testing(CommandLine* command_line) { + command_line_for_testing_ = command_line; + } + + // Add/Remove observers. + void AddObserver(DesktopBackgroundControllerObserver* observer); + void RemoveObserver(DesktopBackgroundControllerObserver* observer); + + // Provides current image on the background, or empty gfx::ImageSkia if there + // is no image, e.g. background is solid color. + gfx::ImageSkia GetWallpaper() const; + + WallpaperLayout GetWallpaperLayout() const; + + // Initialize root window's background. + void OnRootWindowAdded(aura::RootWindow* root_window); + + // Loads builtin wallpaper asynchronously and sets to current wallpaper + // after loaded. Returns true if the controller started loading the + // wallpaper and false otherwise (i.e. the appropriate wallpaper was + // already loading or loaded). + bool SetDefaultWallpaper(bool is_guest); + + // Sets the user selected custom wallpaper. Called when user selected a file + // from file system or changed the layout of wallpaper. + void SetCustomWallpaper(const gfx::ImageSkia& image, WallpaperLayout layout); + + // Cancels the current wallpaper loading operation. + void CancelPendingWallpaperOperation(); + + // Sets the desktop background to solid color mode and creates a solid + // |color| layout. + void SetDesktopBackgroundSolidColorMode(SkColor color); + + // Creates an empty wallpaper. Some tests require a wallpaper widget is ready + // when running. However, the wallpaper widgets are now created asynchronously + // . If loading a real wallpaper, there are cases that these tests crash + // because the required widget is not ready. This function synchronously + // creates an empty widget for those tests to prevent crashes. An example test + // is SystemGestureEventFilterTest.ThreeFingerSwipe. + void CreateEmptyWallpaper(); + + // Returns the appropriate wallpaper resolution for all root windows. + WallpaperResolution GetAppropriateResolution(); + + // Move all desktop widgets to locked container. + // Returns true if the desktop moved. + bool MoveDesktopToLockedContainer(); + + // Move all desktop widgets to unlocked container. + // Returns true if the desktop moved. + bool MoveDesktopToUnlockedContainer(); + + private: + friend class internal::DesktopBackgroundControllerTest; + + // An operation to asynchronously loads wallpaper. + class WallpaperLoader; + + // Returns true if the specified default wallpaper is already being + // loaded by |wallpaper_loader_| or stored in |current_wallpaper_|. + bool DefaultWallpaperIsAlreadyLoadingOrLoaded( + const base::FilePath& image_file, int image_resource_id) const; + + // Returns true if the specified custom wallpaper is already stored + // in |current_wallpaper_|. + bool CustomWallpaperIsAlreadyLoaded(const gfx::ImageSkia& image) const; + + // Creates view for all root windows, or notifies them to repaint if they + // already exist. + void SetDesktopBackgroundImageMode(); + + // Creates a new background widget and sets the background mode to image mode. + // Called after a default wallpaper has been loaded successfully. + void OnDefaultWallpaperLoadCompleted(scoped_refptr<WallpaperLoader> loader); + + // Adds layer with solid |color| to container |container_id| in |root_window|. + ui::Layer* SetColorLayerForContainer(SkColor color, + aura::RootWindow* root_window, + int container_id); + + // Creates and adds component for current mode (either Widget or Layer) to + // |root_window|. + void InstallDesktopController(aura::RootWindow* root_window); + + // Creates and adds component for current mode (either Widget or Layer) to + // all root windows. + void InstallDesktopControllerForAllWindows(); + + // Moves all desktop components from one container to other across all root + // windows. Returns true if a desktop moved. + bool ReparentBackgroundWidgets(int src_container, int dst_container); + + // Returns id for background container for unlocked and locked states. + int GetBackgroundContainerId(bool locked); + + // Send notification that background animation finished. + void NotifyAnimationFinished(); + + // If non-NULL, used in place of the real command line. + CommandLine* command_line_for_testing_; + + // Can change at runtime. + bool locked_; + + BackgroundMode desktop_background_mode_; + + SkColor background_color_; + + ObserverList<DesktopBackgroundControllerObserver> observers_; + + // The current wallpaper. + scoped_ptr<WallpaperResizer> current_wallpaper_; + + // If a default wallpaper is stored in |current_wallpaper_|, the path and + // resource ID that were passed to WallpaperLoader when loading it. + // Otherwise, empty and -1, respectively. + base::FilePath current_default_wallpaper_path_; + int current_default_wallpaper_resource_id_; + + scoped_refptr<WallpaperLoader> wallpaper_loader_; + + base::WeakPtrFactory<DesktopBackgroundController> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(DesktopBackgroundController); +}; + +} // namespace ash + +#endif // ASH_DESKTOP_BACKGROUND_DESKTOP_BACKGROUND_CONTROLLER_H_ |