| Index: ash/wm/workspace/workspace_manager.cc
|
| diff --git a/ash/wm/workspace/workspace_manager.cc b/ash/wm/workspace/workspace_manager.cc
|
| index 6ec64cb80908d74fda1413d3f8a16a25d9191288..249d569f0668bde5f2024101484de1c9ae9e0a6e 100644
|
| --- a/ash/wm/workspace/workspace_manager.cc
|
| +++ b/ash/wm/workspace/workspace_manager.cc
|
| @@ -70,8 +70,6 @@ namespace internal {
|
| WorkspaceManager::WorkspaceManager(aura::Window* contents_view)
|
| : contents_view_(contents_view),
|
| active_workspace_(NULL),
|
| - workspace_size_(
|
| - gfx::Screen::GetMonitorAreaNearestWindow(contents_view_).size()),
|
| is_overview_(false),
|
| ignored_window_(NULL),
|
| grid_size_(0),
|
| @@ -105,6 +103,7 @@ void WorkspaceManager::AddWindow(aura::Window* window) {
|
| current_workspace->Activate();
|
| }
|
| window->Show();
|
| + UpdateShelfVisibility();
|
| return;
|
| }
|
|
|
| @@ -128,6 +127,7 @@ void WorkspaceManager::AddWindow(aura::Window* window) {
|
| workspace = CreateWorkspace(type_for_window);
|
| workspace->AddWindowAfter(window, NULL);
|
| workspace->Activate();
|
| + UpdateShelfVisibility();
|
| }
|
|
|
| void WorkspaceManager::RemoveWindow(aura::Window* window) {
|
| @@ -136,6 +136,7 @@ void WorkspaceManager::RemoveWindow(aura::Window* window) {
|
| return;
|
| workspace->RemoveWindow(window);
|
| CleanupWorkspace(workspace);
|
| + UpdateShelfVisibility();
|
| }
|
|
|
| void WorkspaceManager::SetActiveWorkspaceByWindow(aura::Window* window) {
|
| @@ -144,33 +145,65 @@ void WorkspaceManager::SetActiveWorkspaceByWindow(aura::Window* window) {
|
| workspace->Activate();
|
| }
|
|
|
| -gfx::Rect WorkspaceManager::GetDragAreaBounds() {
|
| - return GetWorkAreaBounds();
|
| -}
|
| -
|
| void WorkspaceManager::SetOverview(bool overview) {
|
| if (is_overview_ == overview)
|
| return;
|
| NOTIMPLEMENTED();
|
| }
|
|
|
| -void WorkspaceManager::SetWorkspaceSize(const gfx::Size& workspace_size) {
|
| - if (workspace_size == workspace_size_)
|
| - return;
|
| - workspace_size_ = workspace_size;
|
| - SetWorkspaceBounds();
|
| -}
|
| -
|
| -void WorkspaceManager::OnMonitorWorkAreaInsetsChanged() {
|
| - SetWorkspaceBounds();
|
| -}
|
| -
|
| gfx::Rect WorkspaceManager::AlignBoundsToGrid(const gfx::Rect& bounds) {
|
| if (grid_size_ <= 1)
|
| return bounds;
|
| return AlignRectToGrid(bounds, grid_size_);
|
| }
|
|
|
| +void WorkspaceManager::UpdateShelfVisibility() {
|
| + if (!shelf_ || !active_workspace_) {
|
| + shelf_->SetState(ShelfLayoutManager::VISIBLE,
|
| + ShelfLayoutManager::AUTO_HIDE_SHOWN);
|
| + shelf_->SetWindowOverlapsShelf(false);
|
| + return;
|
| + }
|
| +
|
| + // TODO: this code needs to be made multi-monitor aware.
|
| + gfx::Rect bounds(gfx::Screen::GetMonitorAreaNearestWindow(contents_view_));
|
| + bounds.set_height(bounds.height() - shelf_->shelf_height());
|
| + const aura::Window::Windows& windows(contents_view_->children());
|
| + bool has_full_screen_window = false;
|
| + bool has_max_window = false;
|
| + bool window_overlaps_launcher = false;
|
| + for (aura::Window::Windows::const_iterator i = windows.begin();
|
| + i != windows.end(); ++i) {
|
| + if (!IsManagingWindow(*i))
|
| + continue;
|
| + ui::Layer* layer = (*i)->layer();
|
| + if (!layer->GetTargetVisibility() || layer->GetTargetOpacity() == 0.0f)
|
| + continue;
|
| + if (wm::IsWindowMaximized(*i)) {
|
| + has_max_window = true;
|
| + break;
|
| + }
|
| + if (wm::IsWindowFullscreen(*i)) {
|
| + has_full_screen_window = true;
|
| + break;
|
| + }
|
| + if (!window_overlaps_launcher && (*i)->bounds().bottom() > bounds.bottom())
|
| + window_overlaps_launcher = true;
|
| + }
|
| +
|
| + ShelfLayoutManager::VisibilityState visibility_state =
|
| + ShelfLayoutManager::VISIBLE;
|
| + ShelfLayoutManager::AutoHideState auto_hide_state =
|
| + shelf_->auto_hide_state();
|
| + if (has_full_screen_window) {
|
| + visibility_state = ShelfLayoutManager::HIDDEN;
|
| + } else if (has_max_window) {
|
| + visibility_state = ShelfLayoutManager::AUTO_HIDE;
|
| + }
|
| + shelf_->SetState(visibility_state, auto_hide_state);
|
| + shelf_->SetWindowOverlapsShelf(window_overlaps_launcher);
|
| +}
|
| +
|
| void WorkspaceManager::ShowStateChanged(aura::Window* window) {
|
| if (!IsManagedWindow(window) || !FindBy(window))
|
| return;
|
| @@ -188,7 +221,6 @@ void WorkspaceManager::ShowStateChanged(aura::Window* window) {
|
| void WorkspaceManager::AddWorkspace(Workspace* workspace) {
|
| DCHECK(std::find(workspaces_.begin(), workspaces_.end(),
|
| workspace) == workspaces_.end());
|
| - workspace->SetBounds(GetWorkAreaBounds());
|
| if (active_workspace_) {
|
| // New workspaces go right after current workspace.
|
| Workspaces::iterator i = std::find(workspaces_.begin(), workspaces_.end(),
|
| @@ -216,15 +248,6 @@ void WorkspaceManager::RemoveWorkspace(Workspace* workspace) {
|
| }
|
| }
|
|
|
| -void WorkspaceManager::UpdateShelfVisibility() {
|
| - if (!shelf_ || !active_workspace_)
|
| - return;
|
| - std::set<aura::Window*> windows;
|
| - windows.insert(active_workspace_->windows().begin(),
|
| - active_workspace_->windows().end());
|
| - shelf_->SetVisible(!wm::HasFullscreenWindow(windows));
|
| -}
|
| -
|
| void WorkspaceManager::SetVisibilityOfWorkspaceWindows(
|
| ash::internal::Workspace* workspace,
|
| AnimateChangeType change_type,
|
| @@ -291,16 +314,6 @@ void WorkspaceManager::SetActiveWorkspace(Workspace* workspace) {
|
| is_overview_ = false;
|
| }
|
|
|
| -gfx::Rect WorkspaceManager::GetWorkAreaBounds() const {
|
| - gfx::Rect bounds(workspace_size_);
|
| - const aura::MonitorManager* monitor_manager =
|
| - aura::Env::GetInstance()->monitor_manager();
|
| - const aura::Monitor* monitor =
|
| - monitor_manager->GetMonitorNearestWindow(contents_view_);
|
| - bounds.Inset(monitor->work_area_insets());
|
| - return bounds;
|
| -}
|
| -
|
| // Returns the index of the workspace that contains the |window|.
|
| int WorkspaceManager::GetWorkspaceIndexContaining(aura::Window* window) const {
|
| for (Workspaces::const_iterator i = workspaces_.begin();
|
| @@ -319,13 +332,6 @@ void WorkspaceManager::SetWindowBounds(aura::Window* window,
|
| ignored_window_ = NULL;
|
| }
|
|
|
| -void WorkspaceManager::SetWorkspaceBounds() {
|
| - for (Workspaces::const_iterator i = workspaces_.begin();
|
| - i != workspaces_.end(); ++i) {
|
| - (*i)->SetBounds(GetWorkAreaBounds());
|
| - }
|
| -}
|
| -
|
| void WorkspaceManager::OnTypeOfWorkspacedNeededChanged(aura::Window* window) {
|
| DCHECK(IsManagedWindow(window));
|
| Workspace* current_workspace = FindBy(window);
|
|
|