Commit f4bb9fde authored by sky@chromium.org's avatar sky@chromium.org

Changes all non-workspace code to talk to WorkspaceManager via

WorkspaceController. This is a precursor to making WorkspaceManager
an interface and adding a new WorkspaceManager variant for the new
window heurisics.

BUG=137342
TEST=none
R=ben@chromium.org


Review URL: https://chromiumcodereview.appspot.com/10852003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@149890 0039d316-1c4b-4281-b951-d872f2087c98
parent 688ee168
......@@ -341,6 +341,7 @@
'wm/workspace/workspace_layout_manager.h',
'wm/workspace/workspace_manager.cc',
'wm/workspace/workspace_manager.h',
'wm/workspace/workspace_types.h',
'wm/workspace/workspace_window_resizer.cc',
'wm/workspace/workspace_window_resizer.h',
],
......
......@@ -19,7 +19,6 @@
#include "ash/wm/toplevel_window_event_filter.h"
#include "ash/wm/visibility_controller.h"
#include "ash/wm/window_properties.h"
#include "ash/wm/workspace/workspace_manager.h"
#include "ash/wm/workspace_controller.h"
#include "ui/aura/client/activation_client.h"
#include "ui/aura/client/aura_constants.h"
......@@ -289,7 +288,7 @@ void RootWindowController::CloseChildWindows() {
}
bool RootWindowController::IsInMaximizedMode() const {
return workspace_controller_->workspace_manager()->IsInMaximizedMode();
return workspace_controller_->IsInMaximizedMode();
}
void RootWindowController::MoveWindowsTo(aura::RootWindow* dst) {
......
......@@ -65,7 +65,6 @@
#include "ash/wm/window_properties.h"
#include "ash/wm/workspace/workspace_event_filter.h"
#include "ash/wm/workspace/workspace_layout_manager.h"
#include "ash/wm/workspace/workspace_manager.h"
#include "ash/wm/workspace_controller.h"
#include "base/bind.h"
#include "base/command_line.h"
......@@ -661,8 +660,8 @@ SystemTray* Shell::system_tray() {
}
int Shell::GetGridSize() const {
return GetPrimaryRootWindowController()->workspace_controller()->
workspace_manager()->grid_size();
return
GetPrimaryRootWindowController()->workspace_controller()->GetGridSize();
}
void Shell::InitRootWindowForSecondaryDisplay(aura::RootWindow* root) {
......@@ -753,12 +752,11 @@ void Shell::InitLayoutManagersForPrimaryDisplay(
controller->GetContainer(internal::kShellWindowId_StatusContainer)->
SetLayoutManager(status_area_layout_manager);
shelf_layout_manager->set_workspace_manager(
controller->workspace_controller()->workspace_manager());
shelf_layout_manager->set_workspace_controller(
controller->workspace_controller());
// TODO(oshima): Support multiple displays.
controller->workspace_controller()->workspace_manager()->
set_shelf(shelf());
controller->workspace_controller()->SetShelf(shelf());
// Create Panel layout manager
aura::Window* panel_container = GetContainer(
......@@ -772,11 +770,12 @@ void Shell::InitLayoutManagersForPrimaryDisplay(
panel_container->SetLayoutManager(panel_layout_manager_);
}
// TODO: this is only used in tests, move with test.
void Shell::DisableWorkspaceGridLayout() {
RootWindowControllerList controllers = GetAllRootWindowControllers();
for (RootWindowControllerList::iterator iter = controllers.begin();
iter != controllers.end(); ++iter)
(*iter)->workspace_controller()->workspace_manager()->set_grid_size(0);
(*iter)->workspace_controller()->SetGridSize(0);
}
void Shell::SetCursor(gfx::NativeCursor cursor) {
......
......@@ -14,7 +14,7 @@
#include "ash/system/status_area_widget.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/web_notification/web_notification_tray.h"
#include "ash/wm/workspace/workspace_manager.h"
#include "ash/wm/workspace_controller.h"
#include "base/auto_reset.h"
#include "base/i18n/rtl.h"
#include "ui/aura/client/activation_client.h"
......@@ -129,7 +129,7 @@ ShelfLayoutManager::ShelfLayoutManager(views::Widget* status)
alignment_(SHELF_ALIGNMENT_BOTTOM),
launcher_(NULL),
status_(status),
workspace_manager_(NULL),
workspace_controller_(NULL),
window_overlaps_shelf_(false) {
Shell::GetInstance()->AddShellObserver(this);
aura::client::GetActivationClient(root_window_)->AddObserver(this);
......@@ -231,24 +231,23 @@ void ShelfLayoutManager::UpdateVisibilityState() {
if (delegate && delegate->IsScreenLocked()) {
SetState(VISIBLE);
} else {
WorkspaceManager::WindowState window_state(
workspace_manager_->GetWindowState());
WorkspaceWindowState window_state(workspace_controller_->GetWindowState());
switch (window_state) {
case WorkspaceManager::WINDOW_STATE_FULL_SCREEN:
case WORKSPACE_WINDOW_STATE_FULL_SCREEN:
SetState(HIDDEN);
break;
case WorkspaceManager::WINDOW_STATE_MAXIMIZED:
case WORKSPACE_WINDOW_STATE_MAXIMIZED:
SetState(auto_hide_behavior_ != SHELF_AUTO_HIDE_BEHAVIOR_NEVER ?
AUTO_HIDE : VISIBLE);
break;
case WorkspaceManager::WINDOW_STATE_WINDOW_OVERLAPS_SHELF:
case WorkspaceManager::WINDOW_STATE_DEFAULT:
case WORKSPACE_WINDOW_STATE_WINDOW_OVERLAPS_SHELF:
case WORKSPACE_WINDOW_STATE_DEFAULT:
SetState(auto_hide_behavior_ == SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS ?
AUTO_HIDE : VISIBLE);
SetWindowOverlapsShelf(window_state ==
WorkspaceManager::WINDOW_STATE_WINDOW_OVERLAPS_SHELF);
WORKSPACE_WINDOW_STATE_WINDOW_OVERLAPS_SHELF);
}
}
}
......
......@@ -32,7 +32,7 @@ class ScreenAsh;
namespace internal {
class ShelfLayoutManagerTest;
class WorkspaceManager;
class WorkspaceController;
// ShelfLayoutManager is the layout manager responsible for the launcher and
// status widgets. The launcher is given the total available width and told the
......@@ -98,8 +98,8 @@ class ASH_EXPORT ShelfLayoutManager :
bool SetAlignment(ShelfAlignment alignment);
ShelfAlignment alignment() const { return alignment_; }
void set_workspace_manager(WorkspaceManager* manager) {
workspace_manager_ = manager;
void set_workspace_controller(WorkspaceController* controller) {
workspace_controller_ = controller;
}
views::Widget* launcher_widget() {
......@@ -261,7 +261,7 @@ class ASH_EXPORT ShelfLayoutManager :
Launcher* launcher_;
views::Widget* status_;
WorkspaceManager* workspace_manager_;
WorkspaceController* workspace_controller_;
// Do any windows overlap the shelf? This is maintained by WorkspaceManager.
bool window_overlaps_shelf_;
......
......@@ -7,6 +7,7 @@
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
#include "ash/wm/window_util.h"
#include "ash/wm/workspace_controller_test_helper.h"
#include "ash/wm/workspace/workspace_manager.h"
#include "ash/wm/workspace_controller.h"
#include "ui/aura/test/event_generator.h"
......@@ -40,9 +41,9 @@ class WorkspaceEventFilterTest : public test::AshTestBase {
};
TEST_F(WorkspaceEventFilterTest, DoubleClickSingleAxisResizeEdge) {
Shell::TestApi shell_test(Shell::GetInstance());
WorkspaceManager* manager =
shell_test.workspace_controller()->workspace_manager();
WorkspaceControllerTestHelper workspace_helper(
Shell::TestApi(Shell::GetInstance()).workspace_controller());
WorkspaceManager* manager = workspace_helper.workspace_manager();
manager->set_grid_size(0);
// Double clicking the vertical resize edge of a window should maximize it
......
......@@ -139,9 +139,9 @@ void WorkspaceManager::UpdateShelfVisibility() {
shelf_->UpdateVisibilityState();
}
WorkspaceManager::WindowState WorkspaceManager::GetWindowState() {
WorkspaceWindowState WorkspaceManager::GetWindowState() const {
if (!shelf_ || !active_workspace_)
return WINDOW_STATE_DEFAULT;
return WORKSPACE_WINDOW_STATE_DEFAULT;
// TODO: this code needs to be made multi-display aware.
gfx::Rect shelf_bounds(shelf_->GetIdealBounds());
......@@ -158,16 +158,17 @@ WorkspaceManager::WindowState WorkspaceManager::GetWindowState() {
// we hit a maximized window.
has_maximized_window = true;
} else if (wm::IsWindowFullscreen(*i)) {
return WINDOW_STATE_FULL_SCREEN;
return WORKSPACE_WINDOW_STATE_FULL_SCREEN;
}
if (!window_overlaps_launcher && (*i)->bounds().Intersects(shelf_bounds))
window_overlaps_launcher = true;
}
if (has_maximized_window)
return WINDOW_STATE_MAXIMIZED;
return WORKSPACE_WINDOW_STATE_MAXIMIZED;
return window_overlaps_launcher ? WINDOW_STATE_WINDOW_OVERLAPS_SHELF :
WINDOW_STATE_DEFAULT;
return window_overlaps_launcher ?
WORKSPACE_WINDOW_STATE_WINDOW_OVERLAPS_SHELF :
WORKSPACE_WINDOW_STATE_DEFAULT;
}
void WorkspaceManager::ShowStateChanged(aura::Window* window) {
......
......@@ -9,6 +9,7 @@
#include "ash/ash_export.h"
#include "ash/wm/workspace/workspace.h"
#include "ash/wm/workspace/workspace_types.h"
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "ui/gfx/insets.h"
......@@ -32,20 +33,6 @@ class WorkspaceManagerTest;
// WorkspaceManager manages multiple workspaces in the desktop.
class ASH_EXPORT WorkspaceManager {
public:
enum WindowState {
// There's a full screen window.
WINDOW_STATE_FULL_SCREEN,
// There's a maximized window.
WINDOW_STATE_MAXIMIZED,
// At least one window overlaps the shelf.
WINDOW_STATE_WINDOW_OVERLAPS_SHELF,
// None of the windows are fullscreen, maximized or touch the shelf.
WINDOW_STATE_DEFAULT,
};
explicit WorkspaceManager(aura::Window* viewport);
virtual ~WorkspaceManager();
......@@ -88,7 +75,7 @@ class ASH_EXPORT WorkspaceManager {
void UpdateShelfVisibility();
// Returns the current window state.
WindowState GetWindowState();
WorkspaceWindowState GetWindowState() const;
// Invoked when the show state of the specified window changes.
void ShowStateChanged(aura::Window* window);
......
......@@ -14,7 +14,7 @@
#include "ash/wm/window_util.h"
#include "ash/wm/workspace/workspace.h"
#include "ash/wm/workspace/workspace_layout_manager.h"
#include "ash/wm/workspace_controller.h"
#include "ash/wm/workspace_controller_test_helper.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/root_window.h"
#include "ui/aura/test/event_generator.h"
......@@ -75,8 +75,9 @@ class WorkspaceManagerTest : public test::AshTestBase {
// Overridden from AshTestBase:
virtual void SetUp() OVERRIDE {
test::AshTestBase::SetUp();
Shell::TestApi shell_test(Shell::GetInstance());
manager_ = shell_test.workspace_controller()->workspace_manager();
WorkspaceControllerTestHelper workspace_helper(
Shell::TestApi(Shell::GetInstance()).workspace_controller());
manager_ = workspace_helper.workspace_manager();
manager_->set_grid_size(0);
}
virtual void TearDown() OVERRIDE {
......@@ -607,7 +608,7 @@ TEST_F(WorkspaceManagerTest, GetWindowStateWithUnmanagedFullscreenWindow) {
EXPECT_EQ(ShelfLayoutManager::HIDDEN, shelf->visibility_state());
ASSERT_FALSE(manager_->ShouldManageWindow(w2.get()));
EXPECT_EQ(WorkspaceManager::WINDOW_STATE_FULL_SCREEN,
EXPECT_EQ(WORKSPACE_WINDOW_STATE_FULL_SCREEN,
manager_->GetWindowState());
w2->Hide();
......@@ -643,7 +644,7 @@ TEST_F(WorkspaceManagerTest,
// to hide.
EXPECT_EQ(ShelfLayoutManager::HIDDEN, shelf->visibility_state());
ASSERT_FALSE(manager_->ShouldManageWindow(w2.get()));
EXPECT_EQ(WorkspaceManager::WINDOW_STATE_FULL_SCREEN,
EXPECT_EQ(WORKSPACE_WINDOW_STATE_FULL_SCREEN,
manager_->GetWindowState());
w2->Hide();
......@@ -651,7 +652,7 @@ TEST_F(WorkspaceManagerTest,
w2->Show();
EXPECT_EQ(ShelfLayoutManager::HIDDEN, shelf->visibility_state());
EXPECT_EQ(WorkspaceManager::WINDOW_STATE_FULL_SCREEN,
EXPECT_EQ(WORKSPACE_WINDOW_STATE_FULL_SCREEN,
manager_->GetWindowState());
w2.reset();
......
// Copyright (c) 2012 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.
#ifndef ASH_WM_WORKSPACE_WORKSPACE_TYPES_H_
#define ASH_WM_WORKSPACE_WORKSPACE_TYPES_H_
namespace ash {
// Enumeration of the possible window states.
enum WorkspaceWindowState {
// There's a full screen window.
WORKSPACE_WINDOW_STATE_FULL_SCREEN,
// There's a maximized window.
WORKSPACE_WINDOW_STATE_MAXIMIZED,
// At least one window overlaps the shelf.
WORKSPACE_WINDOW_STATE_WINDOW_OVERLAPS_SHELF,
// None of the windows are fullscreen, maximized or touch the shelf.
WORKSPACE_WINDOW_STATE_DEFAULT,
};
} // namespace ash
#endif // ASH_WM_WORKSPACE_WORKSPACE_TYPES_H_
......@@ -46,11 +46,27 @@ WorkspaceController::~WorkspaceController() {
viewport_->SetLayoutManager(NULL);
}
bool WorkspaceController::IsInMaximizedMode() const {
return workspace_manager_->IsInMaximizedMode();
}
void WorkspaceController::SetGridSize(int grid_size) {
workspace_manager_->set_grid_size(grid_size);
event_filter_->set_grid_size(grid_size);
}
int WorkspaceController::GetGridSize() const {
return workspace_manager_->grid_size();
}
WorkspaceWindowState WorkspaceController::GetWindowState() const {
return workspace_manager_->GetWindowState();
}
void WorkspaceController::SetShelf(ShelfLayoutManager* shelf) {
workspace_manager_->set_shelf(shelf);
}
void WorkspaceController::OnWindowActivated(aura::Window* window,
aura::Window* old_active) {
workspace_manager_->SetActiveWorkspaceByWindow(window);
......
......@@ -6,6 +6,7 @@
#define ASH_WM_WORKSPACE_CONTROLLER_H_
#include "ash/ash_export.h"
#include "ash/wm/workspace/workspace_types.h"
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "ui/aura/client/activation_change_observer.h"
......@@ -17,6 +18,7 @@ class Window;
namespace ash {
namespace internal {
class ShelfLayoutManager;
class WorkspaceControllerTestHelper;
class WorkspaceEventFilter;
class WorkspaceLayoutManager;
......@@ -25,19 +27,23 @@ class WorkspaceManager;
// WorkspaceController acts as a central place that ties together all the
// various workspace pieces: WorkspaceManager, WorkspaceLayoutManager and
// WorkspaceEventFilter.
class ASH_EXPORT WorkspaceController :
public aura::client::ActivationChangeObserver {
class ASH_EXPORT WorkspaceController
: public aura::client::ActivationChangeObserver {
public:
explicit WorkspaceController(aura::Window* viewport);
virtual ~WorkspaceController();
// Returns the workspace manager that this controller owns.
WorkspaceManager* workspace_manager() {
return workspace_manager_.get();
}
// Returns true if in maximized or fullscreen mode.
bool IsInMaximizedMode() const;
// Sets the size of the grid.
void SetGridSize(int grid_size);
int GetGridSize() const;
// Returns the current window state.
WorkspaceWindowState GetWindowState() const;
void SetShelf(ShelfLayoutManager* shelf);
// aura::client::ActivationChangeObserver overrides:
virtual void OnWindowActivated(aura::Window* window,
......
......@@ -20,6 +20,9 @@ class WorkspaceControllerTestHelper {
WorkspaceEventFilter* filter() { return controller_->event_filter_; }
MultiWindowResizeController* GetMultiWindowResizeController();
WorkspaceManager* workspace_manager() {
return controller_->workspace_manager_.get();
}
private:
WorkspaceController* controller_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment