Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(278)

Unified Diff: ash/wm/workspace/workspace_manager.cc

Issue 16093036: Do not create a workspace for a maximized window. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix test failure Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ash/wm/workspace/workspace_manager.h ('k') | ash/wm/workspace/workspace_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/wm/workspace/workspace_manager.cc
diff --git a/ash/wm/workspace/workspace_manager.cc b/ash/wm/workspace/workspace_manager.cc
index b4d42260eee8b8db795d587cfe34b62f1f9044a6..4bce76bc31d367bc1c7d79177ac4dc685998604a 100644
--- a/ash/wm/workspace/workspace_manager.cc
+++ b/ash/wm/workspace/workspace_manager.cc
@@ -51,7 +51,7 @@ DEFINE_WINDOW_PROPERTY_KEY(Workspace*, kWorkspaceKey, NULL);
namespace {
-// Duration for fading out the desktop background when maximizing.
+// Duration for fading out the desktop background when fullscreen.
const int kCrossFadeSwitchTimeMS = 700;
// Amount of time to pause before animating anything. Only used during initial
@@ -147,27 +147,17 @@ WorkspaceManager::~WorkspaceManager() {
}
// static
-bool WorkspaceManager::IsMaximized(Window* window) {
- return IsMaximizedState(window->GetProperty(aura::client::kShowStateKey));
-}
-
-// static
-bool WorkspaceManager::IsMaximizedState(ui::WindowShowState state) {
- return state == ui::SHOW_STATE_MAXIMIZED ||
- state == ui::SHOW_STATE_FULLSCREEN;
-}
-
-// static
-bool WorkspaceManager::WillRestoreMaximized(Window* window) {
+bool WorkspaceManager::WillRestoreToWorkspace(Window* window) {
return wm::IsWindowMinimized(window) &&
- IsMaximizedState(window->GetProperty(aura::client::kRestoreShowStateKey));
+ window->GetProperty(aura::client::kRestoreShowStateKey) ==
+ ui::SHOW_STATE_FULLSCREEN;
}
WorkspaceWindowState WorkspaceManager::GetWindowState() const {
if (!shelf_)
return WORKSPACE_WINDOW_STATE_DEFAULT;
- const bool is_active_maximized = active_workspace_->is_maximized();
+ const bool is_active_fullscreen = active_workspace_->is_fullscreen();
const gfx::Rect shelf_bounds(shelf_->GetIdealBounds());
const Window::Windows& windows(active_workspace_->window()->children());
bool window_overlaps_launcher = false;
@@ -179,18 +169,16 @@ WorkspaceWindowState WorkspaceManager::GetWindowState() const {
ui::Layer* layer = (*i)->layer();
if (!layer->GetTargetVisibility() || layer->GetTargetOpacity() == 0.0f)
continue;
- // Ignore maximized/fullscreen windows if we're in the desktop. Such a state
- // is transitory and means we haven't yet switched. If we did consider such
- // windows we'll return the wrong thing, which can lead to prematurely
- // changing the launcher state and clobbering restore bounds.
- if (is_active_maximized) {
- if (wm::IsWindowMaximized(*i)) {
- // An untracked window may still be fullscreen so we keep iterating when
- // we hit a maximized window.
- has_maximized_window = true;
- } else if (wm::IsWindowFullscreen(*i)) {
- return WORKSPACE_WINDOW_STATE_FULL_SCREEN;
- }
+ if (wm::IsWindowMaximized(*i)) {
+ // An untracked window may still be fullscreen so we keep iterating when
+ // we hit a maximized window.
+ has_maximized_window = true;
+ } else if (is_active_fullscreen && wm::IsWindowFullscreen(*i)) {
+ // Ignore fullscreen windows if we're in the desktop. Such a state
+ // is transitory and means we haven't yet switched. If we did consider
+ // such windows we'll return the wrong thing, which can lead to
+ // prematurely anging the launcher state and clobbering restore bounds.
+ return WORKSPACE_WINDOW_STATE_FULL_SCREEN;
}
if (!window_overlaps_launcher && (*i)->bounds().Intersects(shelf_bounds))
window_overlaps_launcher = true;
@@ -221,24 +209,25 @@ void WorkspaceManager::SetActiveWorkspaceByWindow(Window* window) {
// out of would disappear since the workspace changed). Since this case is
// only transiently used (property reset on input release) we don't worry
// about window state. In fact we can't consider window state here as we
- // have to allow dragging of a maximized window to work in this case.
+ // have to allow dragging of a fullscreen window to work in this case.
// . The window persists across all workspaces. For example, the task
// manager is in the desktop worskpace and the current workspace is
- // maximized. If we swapped to the desktop you would lose context. Instead
- // we reparent. The exception to this is if the window is maximized (it
- // needs its own workspace then) or we're in the process of maximizing. If
- // we're in the process of maximizing the window needs its own workspace.
+ // fullscreen. If we swapped to the desktop you would lose context.
+ // Instead we reparent. The exception to this is if the window is
+ // fullscreen (it needs its own workspace then) or we're in the process of
+ // fullscreen. If we're in the process of fullscreen the window needs its
+ // own workspace.
if (!GetTrackedByWorkspace(window) ||
- (GetPersistsAcrossAllWorkspaces(window) && !IsMaximized(window) &&
- !(wm::IsWindowMinimized(window) && WillRestoreMaximized(window)))) {
+ (GetPersistsAcrossAllWorkspaces(window) &&
+ !wm::IsWindowFullscreen(window) && !WillRestoreToWorkspace(window))) {
ReparentWindow(window, active_workspace_->window(), NULL);
} else {
SetActiveWorkspace(workspace, SWITCH_WINDOW_MADE_ACTIVE,
base::TimeDelta());
}
}
- if (workspace->is_maximized() && IsMaximized(window)) {
- // Clicking on the maximized window in a maximized workspace. Force all
+ if (workspace->is_fullscreen() && wm::IsWindowFullscreen(window)) {
+ // Clicking on the fullscreen window in a fullscreen workspace. Force all
// other windows to drop to the desktop.
MoveChildrenToDesktop(workspace->window(), NULL);
}
@@ -251,7 +240,7 @@ Window* WorkspaceManager::GetActiveWorkspaceWindow() {
Window* WorkspaceManager::GetParentForNewWindow(Window* window) {
// Try to put windows with transient parents in the same workspace as their
// transient parent.
- if (window->transient_parent() && !IsMaximized(window)) {
+ if (window->transient_parent() && !wm::IsWindowFullscreen(window)) {
Workspace* workspace = FindBy(window->transient_parent());
if (workspace)
return workspace->window();
@@ -261,7 +250,7 @@ Window* WorkspaceManager::GetParentForNewWindow(Window* window) {
if (!GetTrackedByWorkspace(window))
return active_workspace_->window();
- if (IsMaximized(window)) {
+ if (wm::IsWindowFullscreen(window)) {
// Wait for the window to be made active before showing the workspace.
Workspace* workspace = CreateWorkspace(true);
pending_workspaces_.insert(workspace);
@@ -299,7 +288,7 @@ void WorkspaceManager::SetActiveWorkspaceFromCycler(Workspace* workspace) {
}
void WorkspaceManager::DoInitialAnimation() {
- if (active_workspace_->is_maximized()) {
+ if (active_workspace_->is_fullscreen()) {
RootWindowController* root_controller = GetRootWindowController(
contents_window_->GetRootWindow());
if (root_controller) {
@@ -363,17 +352,17 @@ void WorkspaceManager::SetActiveWorkspace(Workspace* workspace,
active_workspace_->workspace_layout_manager()->
OnDisplayWorkAreaInsetsChanged();
- const bool is_unminimizing_maximized_window =
+ const bool is_unminimizing_fullscreen_window =
unminimizing_workspace_ && unminimizing_workspace_ == active_workspace_ &&
- active_workspace_->is_maximized();
- if (is_unminimizing_maximized_window) {
+ active_workspace_->is_fullscreen();
+ if (is_unminimizing_fullscreen_window) {
// If we're unminimizing a window it needs to be on the top, otherwise you
// won't see the animation.
contents_window_->StackChildAtTop(active_workspace_->window());
- } else if (active_workspace_->is_maximized() &&
- last_active->is_maximized() &&
+ } else if (active_workspace_->is_fullscreen() &&
+ last_active->is_fullscreen() &&
reason != SWITCH_MAXIMIZED_FROM_MAXIMIZED_WORKSPACE) {
- // When switching between maximized windows we need the last active
+ // When switching between fullscreen windows we need the last active
// workspace on top of the new, otherwise the animations won't look
// right. Since only one workspace is visible at a time stacking order of
// the workspace windows ultimately doesn't matter.
@@ -383,7 +372,7 @@ void WorkspaceManager::SetActiveWorkspace(Workspace* workspace,
UpdateShelfVisibility();
// NOTE: duration supplied to this method is only used for desktop background.
- HideWorkspace(last_active, reason, is_unminimizing_maximized_window);
+ HideWorkspace(last_active, reason, is_unminimizing_fullscreen_window);
ShowWorkspace(workspace, last_active, reason);
RootWindowController* root_controller = GetRootWindowController(
@@ -408,8 +397,8 @@ WorkspaceManager::FindWorkspace(Workspace* workspace) {
return std::find(workspaces_.begin(), workspaces_.end(), workspace);
}
-Workspace* WorkspaceManager::CreateWorkspace(bool maximized) {
- return new Workspace(this, contents_window_, maximized);
+Workspace* WorkspaceManager::CreateWorkspace(bool fullscreen) {
+ return new Workspace(this, contents_window_, fullscreen);
}
void WorkspaceManager::MoveWorkspaceToPendingOrDelete(
@@ -452,13 +441,13 @@ void WorkspaceManager::MoveWorkspaceToPendingOrDelete(
void WorkspaceManager::MoveChildrenToDesktop(aura::Window* window,
aura::Window* stack_beneath) {
- // Build the list of windows to move. Exclude maximized/fullscreen and windows
- // with transient parents.
+ // Build the list of windows to move. Exclude fullscreen and windows with
+ // transient parents.
Window::Windows to_move;
for (size_t i = 0; i < window->children().size(); ++i) {
Window* child = window->children()[i];
- if (!child->transient_parent() && !IsMaximized(child) &&
- !WillRestoreMaximized(child)) {
+ if (!child->transient_parent() && !wm::IsWindowFullscreen(child) &&
+ !WillRestoreToWorkspace(child)) {
to_move.push_back(child);
}
}
@@ -609,7 +598,7 @@ void WorkspaceManager::ShowWorkspace(
void WorkspaceManager::HideWorkspace(
Workspace* workspace,
SwitchReason reason,
- bool is_unminimizing_maximized_window) const {
+ bool is_unminimizing_fullscreen_window) const {
WorkspaceAnimationDetails details;
details.direction = active_workspace_ == desktop_workspace() ?
WORKSPACE_ANIMATE_UP : WORKSPACE_ANIMATE_DOWN;
@@ -619,7 +608,7 @@ void WorkspaceManager::HideWorkspace(
details.animate_opacity =
((active_workspace_ == desktop_workspace() ||
workspace != desktop_workspace()) &&
- !is_unminimizing_maximized_window);
+ !is_unminimizing_fullscreen_window);
details.animate_scale = true;
details.animate = true;
break;
@@ -633,7 +622,7 @@ void WorkspaceManager::HideWorkspace(
case SWITCH_MAXIMIZED_FROM_MAXIMIZED_WORKSPACE:
case SWITCH_MAXIMIZED_OR_RESTORED:
- if (active_workspace_->is_maximized()) {
+ if (active_workspace_->is_fullscreen()) {
// Delay the hide until the animation is done.
details.duration =
base::TimeDelta::FromMilliseconds(kCrossFadeSwitchTimeMS);
@@ -726,25 +715,46 @@ void WorkspaceManager::OnWorkspaceWindowShowStateChanged(
ui::Layer* old_layer) {
// |child| better still be in |workspace| else things have gone wrong.
DCHECK_EQ(workspace, child->GetProperty(kWorkspaceKey));
+
+ // Show/hide state of the background has to be set here since maximized window
+ // doesn't create its own workspace anymore.
+ RootWindowController* root_controller = GetRootWindowController(
+ contents_window_->GetRootWindow());
+ aura::Window* background = root_controller->GetContainer(
+ kShellWindowId_DesktopBackgroundContainer);;
+ if (wm::IsWindowMaximized(child)) {
+ ShowOrHideDesktopBackground(
+ background,
+ SWITCH_MAXIMIZED_OR_RESTORED,
+ base::TimeDelta(),
+ false);
+ } else if (last_show_state == ui::SHOW_STATE_MAXIMIZED) {
+ ShowOrHideDesktopBackground(
+ background,
+ SWITCH_MINIMIZED,
+ base::TimeDelta(),
+ true);
+ }
+
if (wm::IsWindowMinimized(child)) {
if (workspace->ShouldMoveToPending())
MoveWorkspaceToPendingOrDelete(workspace, NULL, SWITCH_MINIMIZED);
DCHECK(!old_layer);
} else {
// Set of cases to deal with:
- // . More than one maximized window: move newly maximized window into
+ // . More than one fullscreen window: move newly fullscreen window into
// own workspace.
- // . One maximized window and not in a maximized workspace: move window
+ // . One fullscreen window and not in a fullscreen workspace: move window
// into own workspace.
- // . No maximized window and not in desktop: move to desktop and further
+ // . No fullscreen window and not in desktop: move to desktop and further
// any existing windows are stacked beneath |child|.
const bool is_active = wm::IsActiveWindow(child);
Workspace* new_workspace = NULL;
- const int max_count = workspace->GetNumMaximizedWindows();
- base::TimeDelta duration = old_layer && !IsMaximized(child) ?
+ const int full_count = workspace->GetNumFullscreenWindows();
+ base::TimeDelta duration = (old_layer && !wm::IsWindowFullscreen(child)) ?
GetCrossFadeDuration(old_layer->bounds(), child->bounds()) :
base::TimeDelta::FromMilliseconds(kCrossFadeSwitchTimeMS);
- if (max_count == 0) {
+ if (full_count == 0) {
if (workspace != desktop_workspace()) {
{
base::AutoReset<bool> setter(&in_move_, true);
@@ -759,8 +769,8 @@ void WorkspaceManager::OnWorkspaceWindowShowStateChanged(
if (FindWorkspace(workspace) == workspaces_.end())
workspace = NULL;
}
- } else if ((max_count == 1 && workspace == desktop_workspace()) ||
- max_count > 1) {
+ } else if ((full_count == 1 && workspace == desktop_workspace()) ||
+ full_count > 1) {
new_workspace = CreateWorkspace(true);
pending_workspaces_.insert(new_workspace);
ReparentWindow(child, new_workspace->window(), NULL);
@@ -771,7 +781,7 @@ void WorkspaceManager::OnWorkspaceWindowShowStateChanged(
// active.
if (old_layer) {
SetActiveWorkspace(new_workspace,
- max_count >= 2 ?
+ full_count >= 2 ?
SWITCH_MAXIMIZED_FROM_MAXIMIZED_WORKSPACE :
SWITCH_MAXIMIZED_OR_RESTORED,
duration);
@@ -796,13 +806,14 @@ void WorkspaceManager::OnWorkspaceWindowShowStateChanged(
void WorkspaceManager::OnTrackedByWorkspaceChanged(Workspace* workspace,
aura::Window* window) {
Workspace* new_workspace = NULL;
- if (IsMaximized(window)) {
- if (workspace->is_maximized() && workspace->GetNumMaximizedWindows() == 1) {
- // If |window| is the only window in a maximized workspace then leave
+ if (wm::IsWindowFullscreen(window)) {
+ if (workspace->is_fullscreen() &&
+ workspace->GetNumFullscreenWindows() == 1) {
+ // If |window| is the only window in a fullscreen workspace then leave
// it there. Additionally animate it back to the origin.
ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator());
// All bounds changes get routed through WorkspaceLayoutManager and since
- // the window is maximized WorkspaceLayoutManager is going to force a
+ // the window is fullscreen WorkspaceLayoutManager is going to force a
// value. In other words, it doesn't matter what we supply to SetBounds()
// here.
window->SetBounds(gfx::Rect());
@@ -810,7 +821,7 @@ void WorkspaceManager::OnTrackedByWorkspaceChanged(Workspace* workspace,
}
new_workspace = CreateWorkspace(true);
pending_workspaces_.insert(new_workspace);
- } else if (workspace->is_maximized()) {
+ } else if (workspace->is_fullscreen()) {
new_workspace = desktop_workspace();
} else {
return;
« no previous file with comments | « ash/wm/workspace/workspace_manager.h ('k') | ash/wm/workspace/workspace_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698