Index: ash/desktop_background/desktop_background_view.cc |
diff --git a/ash/desktop_background/desktop_background_view.cc b/ash/desktop_background/desktop_background_view.cc |
index 41345a2f0487467bd89b99feb44db11113bd1c2a..e79bc54b379997572f0a8a7b5a0501e02d3d4960 100644 |
--- a/ash/desktop_background/desktop_background_view.cc |
+++ b/ash/desktop_background/desktop_background_view.cc |
@@ -23,11 +23,47 @@ |
#include "ui/gfx/canvas.h" |
#include "ui/gfx/image/image.h" |
#include "ui/views/widget/widget.h" |
+#include "ui/views/widget/widget_delegate.h" |
namespace ash { |
namespace internal { |
namespace { |
+class DesktopBackgroundViewCleanup : public views::WidgetDelegate { |
+ public: |
+ DesktopBackgroundViewCleanup(views::Widget* widget, |
+ aura::RootWindow* root_window) |
+ : widget_(widget_), |
+ root_window_(root_window) { |
+ } |
+ |
+ // Called when the window closes. The delegate MUST NOT delete itself during |
+ // this call, since it can be called afterwards. See DeleteDelegate(). |
+ virtual void WindowClosing() OVERRIDE { |
+ DesktopBackgroundController* controller = ash::Shell::GetInstance()-> |
+ desktop_background_controller(); |
+ controller->CleanupView(root_window_); |
+ } |
+ |
+ virtual const views::Widget* GetWidget() OVERRIDE const { |
+ return widget_; |
+ } |
+ |
+ virtual views::Widget* GetWidget() OVERRIDE { |
+ return widget_; |
+ } |
+ |
+ virtual void DeleteDelegate() OVERRIDE { |
+ delete this; |
+ } |
+ |
+ private: |
+ views::Widget* widget_; |
+ aura::RootWindow* root_window_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DesktopBackgroundViewCleanup); |
+}; |
+ |
class ShowWallpaperAnimationObserver : public ui::ImplicitAnimationObserver { |
public: |
ShowWallpaperAnimationObserver(aura::RootWindow* root_window, |
@@ -149,12 +185,15 @@ views::Widget* CreateDesktopBackground(aura::RootWindow* root_window, |
DesktopBackgroundController* controller = ash::Shell::GetInstance()-> |
desktop_background_controller(); |
views::Widget* desktop_widget = new views::Widget; |
+ DesktopBackgroundViewCleanup* cleanup; |
+ cleanup = new DesktopBackgroundViewCleanup(desktop_widget, root_window); |
views::Widget::InitParams params( |
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
DesktopBackgroundView* view = new DesktopBackgroundView(); |
params.delegate = view; |
if (controller->GetWallpaper().isNull()) |
params.transparent = true; |
+ params.delegate = cleanup; |
params.parent = root_window->GetChildById(container_id); |
desktop_widget->Init(params); |
desktop_widget->SetContentsView(view); |