Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / ui / wm / core / shadow_controller.cc
index c809389..67a3630 100644 (file)
@@ -51,12 +51,25 @@ bool ShouldUseSmallShadowForWindow(aura::Window* window) {
   return false;
 }
 
+bool IsShadowAlwaysActive(aura::Window* window) {
+  return GetShadowType(window) == SHADOW_TYPE_RECTANGULAR_ALWAYS_ACTIVE;
+}
+
+Shadow::Style GetShadowStyleForWindow(aura::Window* window) {
+  return ShouldUseSmallShadowForWindow(window) ? Shadow::STYLE_SMALL :
+      ((IsActiveWindow(window) || IsShadowAlwaysActive(window)) ?
+       Shadow::STYLE_ACTIVE : Shadow::STYLE_INACTIVE);
+}
+
 // Returns the shadow style to be applied to |losing_active| when it is losing
 // active to |gaining_active|. |gaining_active| may be of a type that hides when
 // inactive, and as such we do not want to render |losing_active| as inactive.
 Shadow::Style GetShadowStyleForWindowLosingActive(
     aura::Window* losing_active,
     aura::Window* gaining_active) {
+  if (IsShadowAlwaysActive(losing_active))
+    return Shadow::STYLE_ACTIVE;
+
   if (gaining_active && aura::client::GetHideOnDeactivate(gaining_active)) {
     aura::Window::Windows::const_iterator it =
         std::find(GetTransientChildren(losing_active).begin(),
@@ -200,6 +213,7 @@ bool ShadowController::Impl::ShouldShowShadowForWindow(
     case SHADOW_TYPE_NONE:
       return false;
     case SHADOW_TYPE_RECTANGULAR:
+    case SHADOW_TYPE_RECTANGULAR_ALWAYS_ACTIVE:
       return true;
     default:
       NOTREACHED() << "Unknown shadow type " << type;
@@ -216,18 +230,18 @@ void ShadowController::Impl::HandlePossibleShadowVisibilityChange(
     aura::Window* window) {
   const bool should_show = ShouldShowShadowForWindow(window);
   Shadow* shadow = GetShadowForWindow(window);
-  if (shadow)
+  if (shadow) {
+    shadow->SetStyle(GetShadowStyleForWindow(window));
     shadow->layer()->SetVisible(should_show);
-  else if (should_show && !shadow)
+  } else if (should_show && !shadow) {
     CreateShadowForWindow(window);
+  }
 }
 
 void ShadowController::Impl::CreateShadowForWindow(aura::Window* window) {
   linked_ptr<Shadow> shadow(new Shadow());
   window_shadows_.insert(make_pair(window, shadow));
-
-  shadow->Init(ShouldUseSmallShadowForWindow(window) ?
-               Shadow::STYLE_SMALL : Shadow::STYLE_ACTIVE);
+  shadow->Init(GetShadowStyleForWindow(window));
   shadow->SetContentBounds(gfx::Rect(window->bounds().size()));
   shadow->layer()->SetVisible(ShouldShowShadowForWindow(window));
   window->layer()->Add(shadow->layer());