// 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/screen_dimmer.h" #include "ash/shell.h" #include "base/time/time.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/compositor/layer.h" #include "ui/compositor/scoped_layer_animation_settings.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" namespace ash { namespace { // Opacity for |dimming_layer_| when it's dimming the screen. const float kDimmingLayerOpacity = 0.4f; // Duration for dimming animations, in milliseconds. const int kDimmingTransitionMs = 200; } // namespace ScreenDimmer::ScreenDimmer(aura::Window* root_window) : root_window_(root_window), currently_dimming_(false) { root_window_->AddObserver(this); } ScreenDimmer::~ScreenDimmer() { root_window_->RemoveObserver(this); } void ScreenDimmer::SetDimming(bool should_dim) { if (should_dim == currently_dimming_) return; if (!dimming_layer_) { dimming_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); dimming_layer_->SetColor(SK_ColorBLACK); dimming_layer_->SetOpacity(0.0f); ui::Layer* root_layer = root_window_->layer(); dimming_layer_->SetBounds(root_layer->bounds()); root_layer->Add(dimming_layer_.get()); root_layer->StackAtTop(dimming_layer_.get()); } currently_dimming_ = should_dim; ui::ScopedLayerAnimationSettings scoped_settings( dimming_layer_->GetAnimator()); scoped_settings.SetTransitionDuration( base::TimeDelta::FromMilliseconds(kDimmingTransitionMs)); dimming_layer_->SetOpacity(should_dim ? kDimmingLayerOpacity : 0.0f); } void ScreenDimmer::OnWindowBoundsChanged(aura::Window* root, const gfx::Rect& old_bounds, const gfx::Rect& new_bounds) { if (dimming_layer_) dimming_layer_->SetBounds(gfx::Rect(root->bounds().size())); } } // namespace ash