| Index: ash/wm/panel_layout_manager.cc | 
| diff --git a/ash/wm/panel_layout_manager.cc b/ash/wm/panel_layout_manager.cc | 
| index 3f95a19a05534e0238e4480f8659e0385492104e..ab3f8ee89260da3d99c1167fe052ce0d7715e325 100644 | 
| --- a/ash/wm/panel_layout_manager.cc | 
| +++ b/ash/wm/panel_layout_manager.cc | 
| @@ -11,6 +11,8 @@ | 
| #include "ash/shell.h" | 
| #include "ash/wm/frame_painter.h" | 
| #include "ash/wm/property_util.h" | 
| +#include "ash/wm/window_animations.h" | 
| +#include "ash/wm/window_util.h" | 
| #include "base/auto_reset.h" | 
| #include "base/bind.h" | 
| #include "base/bind_helpers.h" | 
| @@ -19,6 +21,7 @@ | 
| #include "third_party/skia/include/core/SkPath.h" | 
| #include "ui/aura/client/activation_client.h" | 
| #include "ui/aura/client/aura_constants.h" | 
| +#include "ui/aura/focus_manager.h" | 
| #include "ui/aura/root_window.h" | 
| #include "ui/aura/window.h" | 
| #include "ui/gfx/canvas.h" | 
| @@ -34,8 +37,6 @@ const int kPanelMarginEdge = 4; | 
| const int kPanelMarginMiddle = 8; | 
| const int kPanelIdealSpacing = 4; | 
|  | 
| -const int kMinimizedHeight = 24; | 
| - | 
| const float kMaxHeightFactor = .80f; | 
| const float kMaxWidthFactor = .50f; | 
|  | 
| @@ -159,6 +160,7 @@ void PanelLayoutManager::StartDragging(aura::Window* panel) { | 
| DCHECK(!dragged_panel_); | 
| DCHECK(panel->parent() == panel_container_); | 
| dragged_panel_ = panel; | 
| +  Relayout(); | 
| } | 
|  | 
| void PanelLayoutManager::FinishDragging() { | 
| @@ -176,28 +178,10 @@ void PanelLayoutManager::ToggleMinimize(aura::Window* panel) { | 
| DCHECK(panel->parent() == panel_container_); | 
| if (panel->GetProperty(aura::client::kShowStateKey) == | 
| ui::SHOW_STATE_MINIMIZED) { | 
| -    const gfx::Rect& old_bounds = panel->bounds(); | 
| panel->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); | 
| - | 
| -    gfx::Rect new_bounds(old_bounds); | 
| -    const gfx::Rect* restore_bounds = GetRestoreBoundsInScreen(panel); | 
| -    if (restore_bounds) { | 
| -      new_bounds.set_height(restore_bounds->height()); | 
| -      new_bounds.set_y(old_bounds.bottom() - restore_bounds->height()); | 
| -      SetChildBounds(panel, new_bounds); | 
| -      ClearRestoreBounds(panel); | 
| -    } | 
| } else { | 
| -    const gfx::Rect& old_bounds = panel->bounds(); | 
| panel->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); | 
| -    SetRestoreBoundsInParent(panel, old_bounds); | 
| -    SetChildBounds(panel, | 
| -                   gfx::Rect(old_bounds.x(), | 
| -                             old_bounds.bottom() - kMinimizedHeight, | 
| -                             old_bounds.width(), | 
| -                             kMinimizedHeight)); | 
| } | 
| -  Relayout(); | 
| } | 
|  | 
| //////////////////////////////////////////////////////////////////////////////// | 
| @@ -210,6 +194,7 @@ void PanelLayoutManager::OnWindowAddedToLayout(aura::Window* child) { | 
| if (child == callout_widget_->GetNativeWindow()) | 
| return; | 
| panel_windows_.push_back(child); | 
| +  child->AddObserver(this); | 
| Relayout(); | 
| } | 
|  | 
| @@ -218,6 +203,7 @@ void PanelLayoutManager::OnWillRemoveWindowFromLayout(aura::Window* child) { | 
| std::find(panel_windows_.begin(), panel_windows_.end(), child); | 
| if (found != panel_windows_.end()) | 
| panel_windows_.erase(found); | 
| +  child->RemoveObserver(this); | 
|  | 
| if (dragged_panel_ == child) | 
| dragged_panel_ = NULL; | 
| @@ -279,6 +265,22 @@ void PanelLayoutManager::OnLauncherIconPositionsChanged() { | 
| Relayout(); | 
| } | 
|  | 
| +///////////////////////////////////////////////////////////////////////////// | 
| +// PanelLayoutManager, WindowObserver implementation: | 
| + | 
| +void PanelLayoutManager::OnWindowPropertyChanged(aura::Window* window, | 
| +                                                 const void* key, | 
| +                                                 intptr_t old) { | 
| +  if (key != aura::client::kShowStateKey) | 
| +    return; | 
| +  ui::WindowShowState new_state = | 
| +      window->GetProperty(aura::client::kShowStateKey); | 
| +  if (new_state == ui::SHOW_STATE_MINIMIZED) | 
| +    MinimizePanel(window); | 
| +  else | 
| +    RestorePanel(window); | 
| +} | 
| + | 
| //////////////////////////////////////////////////////////////////////////////// | 
| // PanelLayoutManager, aura::client::ActivationChangeObserver implementation: | 
| void PanelLayoutManager::OnWindowActivated(aura::Window* active, | 
| @@ -291,9 +293,23 @@ void PanelLayoutManager::OnWindowActivated(aura::Window* active, | 
| } | 
| } | 
|  | 
| - | 
| //////////////////////////////////////////////////////////////////////////////// | 
| // PanelLayoutManager private implementation: | 
| + | 
| +void PanelLayoutManager::MinimizePanel(aura::Window* panel) { | 
| +  views::corewm::SetWindowVisibilityAnimationType( | 
| +      panel, WINDOW_VISIBILITY_ANIMATION_TYPE_MINIMIZE); | 
| +  panel->Hide(); | 
| +  if (wm::IsActiveWindow(panel)) | 
| +    wm::DeactivateWindow(panel); | 
| +  Relayout(); | 
| +} | 
| + | 
| +void PanelLayoutManager::RestorePanel(aura::Window* panel) { | 
| +  panel->Show(); | 
| +  Relayout(); | 
| +} | 
| + | 
| void PanelLayoutManager::Relayout() { | 
| if (!launcher_ || !launcher_->widget()) | 
| return; | 
| @@ -324,7 +340,9 @@ void PanelLayoutManager::Relayout() { | 
| if (icon_bounds.IsEmpty()) | 
| continue; | 
|  | 
| -    if (panel->HasFocus()) { | 
| +    if (panel->HasFocus() || | 
| +        panel->Contains( | 
| +            aura::client::GetFocusClient(panel)->GetFocusedWindow())) { | 
| DCHECK(!active_panel); | 
| active_panel = panel; | 
| } | 
|  |