1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ash/wm/screen_dimmer.h" 6 7#include "ash/shell.h" 8#include "base/time/time.h" 9#include "ui/aura/window_event_dispatcher.h" 10#include "ui/compositor/layer.h" 11#include "ui/compositor/scoped_layer_animation_settings.h" 12#include "ui/gfx/rect.h" 13#include "ui/gfx/size.h" 14 15namespace ash { 16namespace { 17 18// Opacity for |dimming_layer_| when it's dimming the screen. 19const float kDimmingLayerOpacity = 0.4f; 20 21// Duration for dimming animations, in milliseconds. 22const int kDimmingTransitionMs = 200; 23 24} // namespace 25 26ScreenDimmer::ScreenDimmer(aura::Window* root_window) 27 : root_window_(root_window), 28 currently_dimming_(false) { 29 root_window_->AddObserver(this); 30} 31 32ScreenDimmer::~ScreenDimmer() { 33 root_window_->RemoveObserver(this); 34} 35 36void ScreenDimmer::SetDimming(bool should_dim) { 37 if (should_dim == currently_dimming_) 38 return; 39 40 if (!dimming_layer_) { 41 dimming_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); 42 dimming_layer_->SetColor(SK_ColorBLACK); 43 dimming_layer_->SetOpacity(0.0f); 44 ui::Layer* root_layer = root_window_->layer(); 45 dimming_layer_->SetBounds(root_layer->bounds()); 46 root_layer->Add(dimming_layer_.get()); 47 root_layer->StackAtTop(dimming_layer_.get()); 48 } 49 50 currently_dimming_ = should_dim; 51 52 ui::ScopedLayerAnimationSettings scoped_settings( 53 dimming_layer_->GetAnimator()); 54 scoped_settings.SetTransitionDuration( 55 base::TimeDelta::FromMilliseconds(kDimmingTransitionMs)); 56 dimming_layer_->SetOpacity(should_dim ? kDimmingLayerOpacity : 0.0f); 57} 58 59void ScreenDimmer::OnWindowBoundsChanged(aura::Window* root, 60 const gfx::Rect& old_bounds, 61 const gfx::Rect& new_bounds) { 62 if (dimming_layer_) 63 dimming_layer_->SetBounds(gfx::Rect(root->bounds().size())); 64} 65 66} // namespace ash 67