Chromium Code Reviews| Index: ash/wm/window_state.cc |
| diff --git a/ash/wm/window_state.cc b/ash/wm/window_state.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..78342aaba2d7527ee7d25e1108c2eef06fdd6777 |
| --- /dev/null |
| +++ b/ash/wm/window_state.cc |
| @@ -0,0 +1,227 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "ash/wm/window_state.h" |
| + |
| +#include "ash/root_window_controller.h" |
| +#include "ash/screen_ash.h" |
| +#include "ash/shell_window_ids.h" |
| +#include "ash/wm/window_properties.h" |
| +#include "ash/wm/window_util.h" |
| +#include "ui/aura/client/aura_constants.h" |
| +#include "ui/aura/window.h" |
| +#include "ui/aura/window_delegate.h" |
| +#include "ui/gfx/display.h" |
| +#include "ui/views/corewm/window_util.h" |
| + |
| +namespace ash { |
| +namespace wm { |
| + |
| +// static |
| +bool WindowState::IsMaximizedOrFullscreenState(ui::WindowShowState show_state) { |
| + return show_state == ui::SHOW_STATE_FULLSCREEN || |
| + show_state == ui::SHOW_STATE_MAXIMIZED; |
| +} |
| + |
| +WindowState::WindowState(aura::Window* window) |
| + : window_(window), |
| + tracked_by_workspace_(true), |
| + window_position_managed_(false), |
| + bounds_changed_by_user_(false), |
| + panel_attached_(true), |
| + continue_drag_after_reparent_(false), |
| + ignored_by_shelf_(false), |
| + always_restores_to_restore_bounds_(false) { |
| +} |
| + |
| +WindowState::~WindowState() { |
| +} |
| + |
| +ui::WindowShowState WindowState::GetShowState() const { |
| + return window_->GetProperty(aura::client::kShowStateKey); |
| +} |
| + |
| +bool WindowState::IsMinimized() const { |
| + return GetShowState() == ui::SHOW_STATE_MINIMIZED; |
| +} |
| + |
| +bool WindowState::IsMaximized() const { |
| + return GetShowState() == ui::SHOW_STATE_MAXIMIZED; |
| +} |
| + |
| +bool WindowState::IsFullscreen() const { |
| + return GetShowState() == ui::SHOW_STATE_FULLSCREEN; |
| +} |
| + |
| +bool WindowState::IsMaximizedOrFullscreen() const { |
| + return IsMaximizedOrFullscreenState(GetShowState()); |
| +} |
| + |
| +bool WindowState::IsNormal() const { |
| + ui::WindowShowState state = window_->GetProperty(aura::client::kShowStateKey); |
| + return state == ui::SHOW_STATE_NORMAL || state == ui::SHOW_STATE_DEFAULT; |
| +} |
| + |
| +bool WindowState::IsActive() const { |
| + return IsActiveWindow(window_); |
| +} |
| + |
| +bool WindowState::CanMaximize() const { |
| + return window_->GetProperty(aura::client::kCanMaximizeKey); |
| +} |
| + |
| +bool WindowState::CanMinimize() const { |
|
James Cook
2013/09/18 20:44:17
I like how all the Ash-specific logic for this typ
|
| + internal::RootWindowController* controller = |
| + internal::RootWindowController::ForWindow(window_); |
| + if (!controller) |
| + return false; |
| + aura::Window* lockscreen = controller->GetContainer( |
| + internal::kShellWindowId_LockScreenContainersContainer); |
| + if (lockscreen->Contains(window_)) |
| + return false; |
| + |
| + return true; |
| +} |
| + |
| +bool WindowState::CanResize() const { |
| + return window_->GetProperty(aura::client::kCanResizeKey); |
| +} |
| + |
| +bool WindowState::CanActivate() const { |
| + return views::corewm::CanActivateWindow(window_); |
| +} |
| + |
| +bool WindowState::CanSnap() const { |
| + if (!CanResize()) |
| + return false; |
| + if (window_->type() == aura::client::WINDOW_TYPE_PANEL) |
| + return false; |
| + // If a window has a maximum size defined, snapping may make it too big. |
| + return window_->delegate() ? window_->delegate()->GetMaximumSize().IsEmpty() : |
| + true; |
| +} |
| + |
| +bool WindowState::HasRestoreBounds() const { |
| + return window_->GetProperty(aura::client::kRestoreBoundsKey) != NULL; |
| +} |
| + |
| +void WindowState::Maximize() { |
| + window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
| +} |
| + |
| +void WindowState::Minimize() { |
| + window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); |
| +} |
| + |
| +void WindowState::Unminimize() { |
| + window_->SetProperty( |
| + aura::client::kShowStateKey, |
| + window_->GetProperty(aura::client::kRestoreShowStateKey)); |
|
James Cook
2013/09/18 20:44:17
Do we care what happens if this property doesn't e
oshima
2013/09/19 01:52:01
I'm not sure. This is what we are doing right now.
|
| + window_->ClearProperty(aura::client::kRestoreShowStateKey); |
| +} |
| + |
| +void WindowState::Activate() { |
| + ActivateWindow(window_); |
| +} |
| + |
| +void WindowState::Normalize() { |
| + window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
| +} |
| + |
| +void WindowState::Deactivate() { |
| + DeactivateWindow(window_); |
| +} |
| + |
| +void WindowState::Restore() { |
| + window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
| +} |
| + |
| +void WindowState::ToggleMaximized() { |
| + if (IsMaximized()) |
| + Restore(); |
| + else if (CanMaximize()) |
| + Maximize(); |
| +} |
| + |
| +void WindowState::SetBoundsInScreen( |
| + const gfx::Rect& bounds_in_screen) { |
| + gfx::Rect bounds_in_parent = |
| + ScreenAsh::ConvertRectFromScreen(window_->parent(), |
| + bounds_in_screen); |
| + window_->SetBounds(bounds_in_parent); |
| +} |
| + |
| +void WindowState::SaveCurrentBoundsForRestore() { |
| + gfx::Rect bounds_in_screen = |
| + ScreenAsh::ConvertRectToScreen(window_->parent(), |
| + window_->bounds()); |
| + SetRestoreBoundsInScreen(bounds_in_screen); |
| +} |
| + |
| +gfx::Rect WindowState::GetRestoreBoundsInScreen() const { |
| + return *window_->GetProperty(aura::client::kRestoreBoundsKey); |
|
James Cook
2013/09/18 20:44:17
Should this check if kRestoreBoundsKey exists?
oshima
2013/09/19 01:52:01
Another option is to return empty rect, but it may
James Cook
2013/09/19 03:49:53
Failing sounds fine here, especially since the old
|
| +} |
| + |
| +gfx::Rect WindowState::GetRestoreBoundsInParent() const { |
| + return ScreenAsh::ConvertRectFromScreen(window_->parent(), |
| + GetRestoreBoundsInScreen()); |
| +} |
| + |
| +void WindowState::SetRestoreBoundsInScreen(const gfx::Rect& bounds) { |
| + window_->SetProperty(aura::client::kRestoreBoundsKey, new gfx::Rect(bounds)); |
| +} |
| + |
| +void WindowState::SetRestoreBoundsInParent(const gfx::Rect& bounds) { |
| + SetRestoreBoundsInScreen( |
| + ScreenAsh::ConvertRectToScreen(window_->parent(), bounds)); |
| +} |
| + |
| +void WindowState::ClearRestoreBounds() { |
| + window_->ClearProperty(aura::client::kRestoreBoundsKey); |
| +} |
| + |
| +void WindowState::SetPreAutoManageWindowBounds( |
| + const gfx::Rect& bounds) { |
| + pre_auto_manage_window_bounds_.reset(new gfx::Rect(bounds)); |
| +} |
| + |
| +void WindowState::AddObserver(Observer* observer) { |
| + observer_list_.AddObserver(observer); |
| +} |
| + |
| +void WindowState::RemoveObserver(Observer* observer) { |
| + observer_list_.RemoveObserver(observer); |
| +} |
| + |
| +void WindowState::SetTrackedByWorkspace(bool tracked_by_workspace) { |
| + if (tracked_by_workspace_ == tracked_by_workspace) |
| + return; |
| + bool old = tracked_by_workspace_; |
| + tracked_by_workspace_ = tracked_by_workspace; |
| + FOR_EACH_OBSERVER(Observer, observer_list_, |
| + OnTrackedByWorkspaceChanged(window_, old)); |
| +} |
| + |
| +WindowState* GetActiveWindowState() { |
| + aura::Window* active = GetActiveWindow(); |
| + return active ? GetWindowState(active) : NULL; |
| +} |
| + |
| +WindowState* GetWindowState(aura::Window* window) { |
| + if (!window) |
| + return NULL; |
| + WindowState* settings = window->GetProperty(internal::kWindowStateKey); |
| + if(!settings) { |
| + settings = new WindowState(window); |
| + window->SetProperty(internal::kWindowStateKey, settings); |
| + } |
| + return settings; |
| +} |
| + |
| +const WindowState* GetWindowState(const aura::Window* window) { |
| + return GetWindowState(const_cast<aura::Window*>(window)); |
| +} |
| + |
| +} // namespace wm |
| +} // namespace ash |