diff options
Diffstat (limited to 'views/widget/widget.cc')
-rw-r--r-- | views/widget/widget.cc | 70 |
1 files changed, 41 insertions, 29 deletions
diff --git a/views/widget/widget.cc b/views/widget/widget.cc index 80ca73d..534efc1 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_created_(false) { } Widget::~Widget() { @@ -311,8 +312,10 @@ 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(); } } @@ -446,7 +449,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 +476,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 +496,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 +829,7 @@ void Widget::EnableInactiveRendering() { void Widget::OnNativeWidgetActivationChanged(bool active) { if (!active) { - SaveWindowPosition(); + SaveWindowPlacement(); // Close any open menus. MenuController* menu_controller = MenuController::GetActiveInstance(); @@ -866,6 +870,8 @@ void Widget::OnNativeWidgetCreated() { if (widget_delegate_->IsModal()) native_widget_->BecomeModal(); + + native_widget_created_ = true; } void Widget::OnNativeWidgetDestroying() { @@ -886,6 +892,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_created_) + SaveWindowPlacement(); } void Widget::OnNativeWidgetBeginUserBoundsChange() { @@ -1055,7 +1067,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 +1075,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 +1086,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 +1106,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 { |