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 15 namespace ash { 16 namespace { 17 18 // Opacity for |dimming_layer_| when it's dimming the screen. 19 const float kDimmingLayerOpacity = 0.4f; 20 21 // Duration for dimming animations, in milliseconds. 22 const int kDimmingTransitionMs = 200; 23 24 } // namespace 25 26 ScreenDimmer::ScreenDimmer(aura::Window* root_window) 27 : root_window_(root_window), 28 currently_dimming_(false) { 29 root_window_->AddObserver(this); 30 } 31 32 ScreenDimmer::~ScreenDimmer() { 33 root_window_->RemoveObserver(this); 34 } 35 36 void 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 59 void 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