| Index: views/widget/widget.cc
|
| diff --git a/views/widget/widget.cc b/views/widget/widget.cc
|
| index 80ca73d7413fc1f87f386ceede1ed83330e3accb..8ed6c8d724acab94f1a18a45af72dbd9cdc51554 100644
|
| --- a/views/widget/widget.cc
|
| +++ b/views/widget/widget.cc
|
| @@ -109,7 +109,7 @@ Widget::InitParams::InitParams()
|
| ownership(NATIVE_WIDGET_OWNS_WIDGET),
|
| mirror_origin_in_rtl(false),
|
| has_dropshadow(false),
|
| - maximize(false),
|
| + show_state(ui::SHOW_STATE_DEFAULT),
|
| double_buffer(false),
|
| parent(NULL),
|
| parent_widget(NULL),
|
| @@ -129,7 +129,7 @@ Widget::InitParams::InitParams(Type type)
|
| ownership(NATIVE_WIDGET_OWNS_WIDGET),
|
| mirror_origin_in_rtl(false),
|
| has_dropshadow(false),
|
| - maximize(false),
|
| + show_state(ui::SHOW_STATE_DEFAULT),
|
| double_buffer(false),
|
| parent(NULL),
|
| parent_widget(NULL),
|
| @@ -158,10 +158,11 @@ Widget::Widget()
|
| frame_type_(FRAME_TYPE_DEFAULT),
|
| disable_inactive_rendering_(false),
|
| widget_closed_(false),
|
| - saved_maximized_state_(false),
|
| + saved_show_state_(ui::SHOW_STATE_DEFAULT),
|
| minimum_size_(100, 100),
|
| focus_on_creation_(true),
|
| - is_top_level_(false) {
|
| + is_top_level_(false),
|
| + native_widget_initialized_(false) {
|
| }
|
|
|
| Widget::~Widget() {
|
| @@ -311,10 +312,13 @@ void Widget::Init(const InitParams& params) {
|
| non_client_view_->set_client_view(widget_delegate_->CreateClientView(this));
|
| SetContentsView(non_client_view_);
|
| SetInitialBounds(params.bounds);
|
| - if (params.maximize)
|
| + if (params.show_state == ui::SHOW_STATE_MAXIMIZED)
|
| Maximize();
|
| + else if (params.show_state == ui::SHOW_STATE_MINIMIZED)
|
| + Minimize();
|
| UpdateWindowTitle();
|
| }
|
| + native_widget_initialized_ = true;
|
| }
|
|
|
| // Unconverted methods (see header) --------------------------------------------
|
| @@ -446,7 +450,7 @@ void Widget::Close() {
|
| if (non_client_view_)
|
| can_close = non_client_view_->CanClose();
|
| if (can_close) {
|
| - SaveWindowPosition();
|
| + SaveWindowPlacement();
|
|
|
| // During tear-down the top-level focus manager becomes unavailable to
|
| // GTK tabbed panes and their children, so normal deregistration via
|
| @@ -473,17 +477,16 @@ void Widget::EnableClose(bool enable) {
|
|
|
| void Widget::Show() {
|
| if (non_client_view_) {
|
| - if (saved_maximized_state_ && !initial_restored_bounds_.IsEmpty()) {
|
| + if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED &&
|
| + !initial_restored_bounds_.IsEmpty()) {
|
| native_widget_->ShowMaximizedWithBounds(initial_restored_bounds_);
|
| } else {
|
| - native_widget_->ShowWithState(saved_maximized_state_ ?
|
| - internal::NativeWidgetPrivate::SHOW_MAXIMIZED :
|
| - internal::NativeWidgetPrivate::SHOW_RESTORED);
|
| + native_widget_->ShowWithWindowState(saved_show_state_);
|
| }
|
| - // |saved_maximized_state_| only applies the first time the window is shown.
|
| - // If we don't reset the value the window will be shown maximized every time
|
| + // |saved_show_state_| only applies the first time the window is shown.
|
| + // If we don't reset the value the window may be shown maximized every time
|
| // it is subsequently shown after being hidden.
|
| - saved_maximized_state_ = false;
|
| + saved_show_state_ = ui::SHOW_STATE_NORMAL;
|
| } else {
|
| native_widget_->Show();
|
| }
|
| @@ -494,14 +497,16 @@ void Widget::Hide() {
|
| }
|
|
|
| void Widget::ShowInactive() {
|
| - // If this gets called with saved_maximized_state_ == true, call SetBounds()
|
| - // with the restored bounds to set the correct size. This normally should
|
| - // not happen, but if it does we should avoid showing unsized windows.
|
| - if (saved_maximized_state_ && !initial_restored_bounds_.IsEmpty()) {
|
| + // If this gets called with saved_show_state_ == ui::SHOW_STATE_MAXIMIZED,
|
| + // call SetBounds()with the restored bounds to set the correct size. This
|
| + // normally should not happen, but if it does we should avoid showing unsized
|
| + // windows.
|
| + if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED &&
|
| + !initial_restored_bounds_.IsEmpty()) {
|
| SetBounds(initial_restored_bounds_);
|
| - saved_maximized_state_ = false;
|
| + saved_show_state_ = ui::SHOW_STATE_NORMAL;
|
| }
|
| - native_widget_->ShowWithState(internal::NativeWidgetPrivate::SHOW_INACTIVE);
|
| + native_widget_->ShowWithWindowState(ui::SHOW_STATE_INACTIVE);
|
| }
|
|
|
| void Widget::Activate() {
|
| @@ -825,7 +830,7 @@ void Widget::EnableInactiveRendering() {
|
|
|
| void Widget::OnNativeWidgetActivationChanged(bool active) {
|
| if (!active) {
|
| - SaveWindowPosition();
|
| + SaveWindowPlacement();
|
|
|
| // Close any open menus.
|
| MenuController* menu_controller = MenuController::GetActiveInstance();
|
| @@ -886,6 +891,12 @@ gfx::Size Widget::GetMinimumSize() {
|
|
|
| void Widget::OnNativeWidgetSizeChanged(const gfx::Size& new_size) {
|
| root_view_->SetSize(new_size);
|
| +
|
| + // Size changed notifications can fire prior to full initialization
|
| + // i.e. during session restore. Avoid saving session state during these
|
| + // startup procedures.
|
| + if (native_widget_initialized_)
|
| + SaveWindowPlacement();
|
| }
|
|
|
| void Widget::OnNativeWidgetBeginUserBoundsChange() {
|
| @@ -1055,7 +1066,7 @@ bool Widget::ShouldReleaseCaptureOnMouseReleased() const {
|
| return true;
|
| }
|
|
|
| -void Widget::SaveWindowPosition() {
|
| +void Widget::SaveWindowPlacement() {
|
| // The window delegate does the actual saving for us. It seems like (judging
|
| // by go/crash) that in some circumstances we can end up here after
|
| // WM_DESTROY, at which point the window delegate is likely gone. So just
|
| @@ -1063,10 +1074,10 @@ void Widget::SaveWindowPosition() {
|
| if (!widget_delegate_)
|
| return;
|
|
|
| - bool maximized = false;
|
| + ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL;
|
| gfx::Rect bounds;
|
| - native_widget_->GetWindowBoundsAndMaximizedState(&bounds, &maximized);
|
| - widget_delegate_->SaveWindowPlacement(bounds, maximized);
|
| + native_widget_->GetWindowPlacement(&bounds, &show_state);
|
| + widget_delegate_->SaveWindowPlacement(bounds, show_state);
|
| }
|
|
|
| void Widget::SetInitialBounds(const gfx::Rect& bounds) {
|
| @@ -1074,8 +1085,8 @@ void Widget::SetInitialBounds(const gfx::Rect& bounds) {
|
| return;
|
|
|
| gfx::Rect saved_bounds;
|
| - if (GetSavedBounds(&saved_bounds, &saved_maximized_state_)) {
|
| - if (saved_maximized_state_) {
|
| + if (GetSavedWindowPlacement(&saved_bounds, &saved_show_state_)) {
|
| + if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED) {
|
| // If we're going to maximize, wait until Show is invoked to set the
|
| // bounds. That way we avoid a noticable resize.
|
| initial_restored_bounds_ = saved_bounds;
|
| @@ -1094,17 +1105,17 @@ void Widget::SetInitialBounds(const gfx::Rect& bounds) {
|
| }
|
| }
|
|
|
| -bool Widget::GetSavedBounds(gfx::Rect* bounds, bool* maximize) {
|
| +bool Widget::GetSavedWindowPlacement(gfx::Rect* bounds,
|
| + ui::WindowShowState* show_state) {
|
| // First we obtain the window's saved show-style and store it. We need to do
|
| // this here, rather than in Show() because by the time Show() is called,
|
| // the window's size will have been reset (below) and the saved maximized
|
| // state will have been lost. Sadly there's no way to tell on Windows when
|
| // a window is restored from maximized state, so we can't more accurately
|
| // track maximized state independently of sizing information.
|
| - widget_delegate_->GetSavedMaximizedState(maximize);
|
|
|
| // Restore the window's placement from the controller.
|
| - if (widget_delegate_->GetSavedWindowBounds(bounds)) {
|
| + if (widget_delegate_->GetSavedWindowPlacement(bounds, show_state)) {
|
| if (!widget_delegate_->ShouldRestoreWindowSize()) {
|
| bounds->set_size(non_client_view_->GetPreferredSize());
|
| } else {
|
|
|