Home | History | Annotate | Download | only in wm
      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