// 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.

#include "ash/wm/system_wallpaper_controller.h"

#include "ui/aura/window.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_type.h"

namespace ash {

SystemWallpaperController::SystemWallpaperController(aura::Window* root_window,
                                                     SkColor color)
    : root_window_(root_window), layer_(new ui::Layer(ui::LAYER_SOLID_COLOR)) {
  root_window_->AddObserver(this);
  layer_->SetColor(color);

  ui::Layer* root_layer = root_window_->layer();
  layer_->SetBounds(gfx::Rect(root_layer->bounds().size()));
  root_layer->Add(layer_.get());
  root_layer->StackAtBottom(layer_.get());
}

SystemWallpaperController::~SystemWallpaperController() {
  root_window_->RemoveObserver(this);
}

void SystemWallpaperController::SetColor(SkColor color) {
  layer_->SetColor(color);
}

void SystemWallpaperController::OnWindowBoundsChanged(
    aura::Window* root,
    const gfx::Rect& old_bounds,
    const gfx::Rect& new_bounds,
    ui::PropertyChangeReason reason) {
  DCHECK_EQ(root_window_, root);
  layer_->SetBounds(gfx::Rect(root_window_->layer()->bounds().size()));
}

}  // namespace ash
