Index: chrome/browser/ui/views/extensions/native_app_window_views.cc |
diff --git a/chrome/browser/ui/views/extensions/native_app_window_views.cc b/chrome/browser/ui/views/extensions/native_app_window_views.cc |
index 41315a2bdb9bfa25abea66ec77fa64334df10201..826e5e98e58286c1663d1c2702233ca9379434ba 100644 |
--- a/chrome/browser/ui/views/extensions/native_app_window_views.cc |
+++ b/chrome/browser/ui/views/extensions/native_app_window_views.cc |
@@ -40,7 +40,9 @@ |
#include "ash/wm/panels/panel_frame_view.h" |
#include "ash/wm/window_properties.h" |
#include "chrome/browser/ui/ash/ash_util.h" |
+#include "ui/aura/client/aura_constants.h" |
#include "ui/aura/root_window.h" |
+#include "ui/aura/window.h" |
#endif |
namespace { |
@@ -266,15 +268,21 @@ void NativeAppWindowViews::InitializePanelWindow( |
window_->Init(params); |
window_->set_focus_on_creation(create_params.focused); |
-#if !defined(USE_ASH) |
- // TODO(oshima|stevenjb): Ideally, we should be able to just pre-determine |
- // the exact location and size, but this doesn't work well |
- // on non-ash environment where we don't have full control over |
- // window management. |
- gfx::Rect window_bounds = |
- window_->non_client_view()->GetWindowBoundsForClientBounds( |
- create_params.bounds); |
- window_->SetBounds(window_bounds); |
+#if defined(USE_ASH) |
+ if (create_params.state == ui::SHOW_STATE_DETACHED) { |
+ gfx::Rect window_bounds(create_params.bounds.x(), |
+ create_params.bounds.y(), |
+ preferred_size_.width(), |
+ preferred_size_.height()); |
+ aura::Window* native_window = GetNativeWindow(); |
+ native_window->SetProperty(ash::internal::kPanelAttachedKey, false); |
+ native_window->SetDefaultParentByRootWindow( |
+ native_window->GetRootWindow(), native_window->GetBoundsInScreen()); |
+ window_->SetBounds(window_bounds); |
+ } |
+#else |
+ // TODO(stevenjb): NativeAppWindow panels need to be implemented for other |
+ // platforms. |
#endif |
} |
@@ -304,6 +312,23 @@ gfx::Rect NativeAppWindowViews::GetRestoredBounds() const { |
return window_->GetRestoredBounds(); |
} |
+ui::WindowShowState NativeAppWindowViews::GetRestoredState() const { |
+ if (IsMaximized()) |
+ return ui::SHOW_STATE_MAXIMIZED; |
+#if defined(USE_ASH) |
+ // On Ash, restore fullscreen. |
+ if (IsFullscreen()) |
+ return ui::SHOW_STATE_FULLSCREEN; |
+ // Use kRestoreShowStateKey in case a window is minimized/hidden. |
+ ui::WindowShowState restore_state = |
+ window_->GetNativeWindow()->GetProperty( |
+ aura::client::kRestoreShowStateKey); |
+ if (restore_state != ui::SHOW_STATE_MINIMIZED) |
+ return restore_state; |
+#endif |
+ return ui::SHOW_STATE_NORMAL; |
+} |
+ |
gfx::Rect NativeAppWindowViews::GetBounds() const { |
return window_->GetWindowBoundsInScreen(); |
} |
@@ -675,6 +700,17 @@ bool NativeAppWindowViews::IsFullscreenOrPending() const { |
return is_fullscreen_; |
} |
+bool NativeAppWindowViews::IsDetached() const { |
+ if (!shell_window_->window_type_is_panel()) |
+ return false; |
+#if defined(USE_ASH) |
+ return !window_->GetNativeWindow()->GetProperty( |
+ ash::internal::kPanelAttachedKey); |
+#else |
+ return false; |
+#endif |
+} |
+ |
views::View* NativeAppWindowViews::GetContentsView() { |
return this; |
} |