diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-25 22:53:59 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-25 22:53:59 +0000 |
commit | c758fbfb081067de767084064c3e94067d922beb (patch) | |
tree | 6adbed42b929e6ce20dce0c4eb51f15e343e4dfa /ash/wm/workspace | |
parent | bbcde910463b8d226b6f077fc4f0009f5c147406 (diff) | |
download | chromium_src-c758fbfb081067de767084064c3e94067d922beb.zip chromium_src-c758fbfb081067de767084064c3e94067d922beb.tar.gz chromium_src-c758fbfb081067de767084064c3e94067d922beb.tar.bz2 |
Adds context menu so that shelf always auto-hides (except on lock
screen). This also cleans up code that was forcing shelf to be visible
when lock screen up, and it removes the 'snap to grid' menu item on
the background.
BUG=119804
TEST=none
R=ben@chromium.org
Review URL: https://chromiumcodereview.appspot.com/9854001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@128839 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash/wm/workspace')
-rw-r--r-- | ash/wm/workspace/workspace_manager.cc | 35 | ||||
-rw-r--r-- | ash/wm/workspace/workspace_manager.h | 17 | ||||
-rw-r--r-- | ash/wm/workspace/workspace_manager_unittest.cc | 7 |
3 files changed, 36 insertions, 23 deletions
diff --git a/ash/wm/workspace/workspace_manager.cc b/ash/wm/workspace/workspace_manager.cc index c6c9dd6..e4cec4b 100644 --- a/ash/wm/workspace/workspace_manager.cc +++ b/ash/wm/workspace/workspace_manager.cc @@ -158,18 +158,17 @@ gfx::Rect WorkspaceManager::AlignBoundsToGrid(const gfx::Rect& bounds) { } void WorkspaceManager::UpdateShelfVisibility() { - if (!shelf_ || !active_workspace_) { - shelf_->SetState(ShelfLayoutManager::VISIBLE); - shelf_->SetWindowOverlapsShelf(false); - return; - } + shelf_->UpdateVisibilityState(); +} + +WorkspaceManager::WindowState WorkspaceManager::GetWindowState() { + if (!shelf_ || !active_workspace_) + return WINDOW_STATE_DEFAULT; // 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) { @@ -178,26 +177,16 @@ void WorkspaceManager::UpdateShelfVisibility() { 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 (wm::IsWindowMaximized(*i)) + return WINDOW_STATE_MAXIMIZED; + if (wm::IsWindowFullscreen(*i)) + return WINDOW_STATE_FULL_SCREEN; if (!window_overlaps_launcher && (*i)->bounds().bottom() > bounds.bottom()) window_overlaps_launcher = true; } - ShelfLayoutManager::VisibilityState visibility_state = - ShelfLayoutManager::VISIBLE; - if (has_full_screen_window) - visibility_state = ShelfLayoutManager::HIDDEN; - else if (has_max_window) - visibility_state = ShelfLayoutManager::AUTO_HIDE; - shelf_->SetState(visibility_state); - shelf_->SetWindowOverlapsShelf(window_overlaps_launcher); + return window_overlaps_launcher ? WINDOW_STATE_WINDOW_OVERLAPS_SHELF : + WINDOW_STATE_DEFAULT; } void WorkspaceManager::ShowStateChanged(aura::Window* window) { diff --git a/ash/wm/workspace/workspace_manager.h b/ash/wm/workspace/workspace_manager.h index e1dbf05..9912f8d 100644 --- a/ash/wm/workspace/workspace_manager.h +++ b/ash/wm/workspace/workspace_manager.h @@ -32,6 +32,20 @@ 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(); @@ -80,6 +94,9 @@ class ASH_EXPORT WorkspaceManager { // Updates the visibility and whether any windows overlap the shelf. void UpdateShelfVisibility(); + // Returns the current window state. + WindowState GetWindowState(); + // Invoked when the show state of the specified window changes. void ShowStateChanged(aura::Window* window); diff --git a/ash/wm/workspace/workspace_manager_unittest.cc b/ash/wm/workspace/workspace_manager_unittest.cc index f15dbfc..5d04322 100644 --- a/ash/wm/workspace/workspace_manager_unittest.cc +++ b/ash/wm/workspace/workspace_manager_unittest.cc @@ -17,6 +17,7 @@ #include "ash/wm/workspace/workspace_layout_manager.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/root_window.h" +#include "ui/aura/test/event_generator.h" #include "ui/aura/window.h" #include "ui/base/ui_base_types.h" #include "ui/gfx/compositor/layer.h" @@ -444,6 +445,12 @@ TEST_F(WorkspaceManagerTest, MinimizeMaximizedWindow) { // Verifies ShelfLayoutManager's visibility/auto-hide state is correctly // updated. TEST_F(WorkspaceManagerTest, ShelfStateUpdated) { + // Since ShelfLayoutManager queries for mouse location, move the mouse so + // it isn't over the shelf. + aura::test::EventGenerator generator( + Shell::GetInstance()->GetRootWindow(), gfx::Point()); + generator.MoveMouseTo(0, 0); + // Two windows, w1 normal, w2 maximized. scoped_ptr<Window> w1(CreateTestWindow()); w1->SetBounds(gfx::Rect(0, 1, 101, 102)); |