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

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

Issue 19460014: Do not create workspace for fullscreen. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 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 ffed0dc0ebc4688e24aa1153b75ef72a08b304f3..cef9fb6cb072438c76bb75ba6801e14360cfca43 100644
--- a/ash/wm/workspace/workspace_manager.cc
+++ b/ash/wm/workspace/workspace_manager.cc
@@ -113,15 +113,13 @@ WorkspaceManager::WorkspaceManager(Window* contents_window)
active_workspace_(NULL),
shelf_(NULL),
in_move_(false),
- clear_unminimizing_workspace_factory_(this),
- unminimizing_workspace_(NULL),
app_terminating_(false),
creating_fade_(false) {
// Clobber any existing event filter.
contents_window->SetEventFilter(NULL);
// |contents_window| takes ownership of LayoutManagerImpl.
contents_window->SetLayoutManager(new LayoutManagerImpl(this));
- active_workspace_ = CreateWorkspace(false);
+ active_workspace_ = new Workspace(this, contents_window_);
workspaces_.push_back(active_workspace_);
active_workspace_->window()->Show();
Shell::GetInstance()->AddShellObserver(this);
@@ -145,18 +143,10 @@ WorkspaceManager::~WorkspaceManager() {
STLDeleteElements(&to_delete_);
}
-// static
-bool WorkspaceManager::WillRestoreToWorkspace(Window* window) {
- return wm::IsWindowMinimized(window) &&
- window->GetProperty(aura::client::kRestoreShowStateKey) ==
- ui::SHOW_STATE_FULLSCREEN;
-}
-
WorkspaceWindowState WorkspaceManager::GetWindowState() const {
if (!shelf_)
return WORKSPACE_WINDOW_STATE_DEFAULT;
- 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;
@@ -172,11 +162,7 @@ WorkspaceWindowState WorkspaceManager::GetWindowState() const {
// 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.
+ } else if (wm::IsWindowFullscreen(*i)) {
return WORKSPACE_WINDOW_STATE_FULL_SCREEN;
}
if (!window_overlaps_launcher && (*i)->bounds().Intersects(shelf_bounds))
@@ -218,18 +204,12 @@ void WorkspaceManager::SetActiveWorkspaceByWindow(Window* window) {
// own workspace.
if (!GetTrackedByWorkspace(window) ||
(GetPersistsAcrossAllWorkspaces(window) &&
- !wm::IsWindowFullscreen(window) && !WillRestoreToWorkspace(window))) {
+ !wm::IsWindowFullscreen(window))) {
ReparentWindow(window, active_workspace_->window(), NULL);
} else {
SetActiveWorkspace(workspace, SWITCH_WINDOW_MADE_ACTIVE);
}
}
-
- 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);
- }
}
Window* WorkspaceManager::GetActiveWorkspaceWindow() {
@@ -239,7 +219,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() && !wm::IsWindowFullscreen(window)) {
+ if (window->transient_parent()) {
Workspace* workspace = FindBy(window->transient_parent());
if (workspace)
return workspace->window();
@@ -249,16 +229,6 @@ Window* WorkspaceManager::GetParentForNewWindow(Window* window) {
if (!GetTrackedByWorkspace(window))
return active_workspace_->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);
- return workspace->window();
- }
-
- if (!GetTrackedByWorkspace(window) || GetPersistsAcrossAllWorkspaces(window))
- return active_workspace_->window();
-
return desktop_workspace()->window();
}
@@ -339,24 +309,9 @@ void WorkspaceManager::SetActiveWorkspace(Workspace* workspace,
active_workspace_->workspace_layout_manager()->
OnDisplayWorkAreaInsetsChanged();
- const bool is_unminimizing_fullscreen_window =
- unminimizing_workspace_ && unminimizing_workspace_ == active_workspace_ &&
- 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_fullscreen() &&
- last_active->is_fullscreen() &&
- reason != SWITCH_FULLSCREEN_FROM_FULLSCREEN_WORKSPACE) {
- // 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.
- contents_window_->StackChildAtTop(last_active->window());
- }
+ contents_window_->StackChildAtTop(last_active->window());
- HideWorkspace(last_active, reason, is_unminimizing_fullscreen_window);
+ HideWorkspace(last_active, reason);
ShowWorkspace(workspace, last_active, reason);
UpdateShelfVisibility();
@@ -371,8 +326,8 @@ WorkspaceManager::FindWorkspace(Workspace* workspace) {
return std::find(workspaces_.begin(), workspaces_.end(), workspace);
}
-Workspace* WorkspaceManager::CreateWorkspace(bool fullscreen) {
- return new Workspace(this, contents_window_, fullscreen);
+Workspace* WorkspaceManager::CreateWorkspaceForTest() {
+ return new Workspace(this, contents_window_);
}
void WorkspaceManager::MoveWorkspaceToPendingOrDelete(
@@ -404,8 +359,6 @@ void WorkspaceManager::MoveWorkspaceToPendingOrDelete(
}
if (workspace->window()->children().empty()) {
- if (workspace == unminimizing_workspace_)
- unminimizing_workspace_ = NULL;
pending_workspaces_.erase(workspace);
ScheduleDelete(workspace);
} else {
@@ -420,8 +373,7 @@ void WorkspaceManager::MoveChildrenToDesktop(aura::Window* window,
Window::Windows to_move;
for (size_t i = 0; i < window->children().size(); ++i) {
Window* child = window->children()[i];
- if (!child->transient_parent() && !wm::IsWindowFullscreen(child) &&
- !WillRestoreToWorkspace(child)) {
+ if (!child->transient_parent() && !wm::IsWindowFullscreen(child)) {
to_move.push_back(child);
}
}
@@ -454,24 +406,6 @@ void WorkspaceManager::ScheduleDelete(Workspace* workspace) {
&WorkspaceManager::ProcessDeletion);
}
-void WorkspaceManager::SetUnminimizingWorkspace(Workspace* workspace) {
- // The normal sequence of unminimizing a window is: Show() the window, which
- // triggers changing the kShowStateKey to NORMAL and lastly the window is made
- // active. This means at the time the window is unminimized we don't know if
- // the workspace it is in is going to become active. To track this
- // |unminimizing_workspace_| is set at the time we unminimize and a task is
- // schedule to reset it. This way when we get the activate we know we're in
- // the process unminimizing and can do the right animation.
- unminimizing_workspace_ = workspace;
- if (unminimizing_workspace_) {
- base::MessageLoop::current()->PostTask(
- FROM_HERE,
- base::Bind(&WorkspaceManager::SetUnminimizingWorkspace,
- clear_unminimizing_workspace_factory_.GetWeakPtr(),
- static_cast<Workspace*>(NULL)));
- }
-}
-
void WorkspaceManager::FadeDesktop(aura::Window* window,
base::TimeDelta duration) {
if (views::corewm::WindowAnimationsDisabled(NULL) ||
@@ -512,9 +446,6 @@ void WorkspaceManager::ShowWorkspace(
switch (reason) {
case SWITCH_WINDOW_MADE_ACTIVE:
case SWITCH_TRACKED_BY_WORKSPACE_CHANGED:
- case SWITCH_WINDOW_REMOVED:
- case SWITCH_VISIBILITY_CHANGED:
- case SWITCH_MINIMIZED:
details.animate = details.animate_scale = true;
details.animate_opacity = last_active == desktop_workspace();
break;
@@ -533,8 +464,7 @@ void WorkspaceManager::ShowWorkspace(
void WorkspaceManager::HideWorkspace(
Workspace* workspace,
- SwitchReason reason,
- bool is_unminimizing_fullscreen_window) const {
+ SwitchReason reason) const {
WorkspaceAnimationDetails details;
details.direction = active_workspace_ == desktop_workspace() ?
WORKSPACE_ANIMATE_UP : WORKSPACE_ANIMATE_DOWN;
@@ -543,29 +473,11 @@ void WorkspaceManager::HideWorkspace(
case SWITCH_TRACKED_BY_WORKSPACE_CHANGED:
details.animate_opacity =
((active_workspace_ == desktop_workspace() ||
- workspace != desktop_workspace()) &&
- !is_unminimizing_fullscreen_window);
+ workspace != desktop_workspace()));
details.animate_scale = true;
details.animate = true;
break;
- case SWITCH_VISIBILITY_CHANGED:
- // The window is most likely closing. Make the workspace visible for the
- // duration of the switch so that the close animation is visible.
- details.animate = true;
- details.animate_scale = true;
- break;
-
- case SWITCH_FULLSCREEN_FROM_FULLSCREEN_WORKSPACE:
- case SWITCH_MAXIMIZED_OR_RESTORED:
- if (active_workspace_->is_fullscreen()) {
- // Delay the hide until the animation is done.
- details.duration =
- base::TimeDelta::FromMilliseconds(kCrossFadeSwitchTimeMS);
- details.animate = true;
- }
- break;
-
// Remaining cases require no animation.
default:
break;
@@ -615,25 +527,19 @@ void WorkspaceManager::OnWillRemoveWindowFromWorkspace(Workspace* workspace,
void WorkspaceManager::OnWindowRemovedFromWorkspace(Workspace* workspace,
Window* child) {
- if (workspace->ShouldMoveToPending())
- MoveWorkspaceToPendingOrDelete(workspace, NULL, SWITCH_WINDOW_REMOVED);
UpdateShelfVisibility();
}
void WorkspaceManager::OnWorkspaceChildWindowVisibilityChanged(
Workspace* workspace,
Window* child) {
- if (workspace->ShouldMoveToPending()) {
- MoveWorkspaceToPendingOrDelete(workspace, NULL, SWITCH_VISIBILITY_CHANGED);
- } else {
- if (child->TargetVisibility())
- RearrangeVisibleWindowOnShow(child);
- else
- RearrangeVisibleWindowOnHideOrRemove(child);
- if (workspace == active_workspace_) {
- UpdateShelfVisibility();
- FramePainter::UpdateSoloWindowHeader(child->GetRootWindow());
- }
+ if (child->TargetVisibility())
+ RearrangeVisibleWindowOnShow(child);
+ else
+ RearrangeVisibleWindowOnHideOrRemove(child);
+ if (workspace == active_workspace_) {
+ UpdateShelfVisibility();
+ FramePainter::UpdateSoloWindowHeader(child->GetRootWindow());
}
}
@@ -647,109 +553,37 @@ void WorkspaceManager::OnWorkspaceWindowChildBoundsChanged(
void WorkspaceManager::OnWorkspaceWindowShowStateChanged(
Workspace* workspace,
Window* child,
- ui::WindowShowState last_show_state,
- ui::Layer* old_layer) {
+ ui::WindowShowState last_show_state) {
// |child| better still be in |workspace| else things have gone wrong.
DCHECK_EQ(workspace, child->GetProperty(kWorkspaceKey));
- 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 fullscreen window: move newly fullscreen window into
- // own workspace.
- // . One fullscreen window and not in a fullscreen workspace: move window
- // into own workspace.
- // . 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 full_count = workspace->GetNumFullscreenWindows();
- base::TimeDelta duration = (old_layer && !wm::IsWindowFullscreen(child)) ?
- GetCrossFadeDuration(old_layer->bounds(), child->bounds()) :
- base::TimeDelta::FromMilliseconds(kCrossFadeSwitchTimeMS);
- if (full_count == 0) {
- if (workspace != desktop_workspace()) {
- {
- base::AutoReset<bool> setter(&in_move_, true);
- ReparentWindow(child, desktop_workspace()->window(), NULL);
- }
- DCHECK(!is_active || old_layer);
- new_workspace = desktop_workspace();
- SetActiveWorkspace(new_workspace, SWITCH_MAXIMIZED_OR_RESTORED);
- MoveWorkspaceToPendingOrDelete(workspace, child,
- SWITCH_MAXIMIZED_OR_RESTORED);
- if (FindWorkspace(workspace) == workspaces_.end())
- workspace = NULL;
- }
- } 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);
- }
- if (is_active && new_workspace) {
- // |old_layer| may be NULL if as part of processing
- // WorkspaceLayoutManager::OnWindowPropertyChanged() the window is made
- // active.
- if (old_layer) {
- SetActiveWorkspace(new_workspace,
- full_count >= 2 ?
- SWITCH_FULLSCREEN_FROM_FULLSCREEN_WORKSPACE :
- SWITCH_MAXIMIZED_OR_RESTORED);
- CrossFadeWindowBetweenWorkspaces(new_workspace->window(), child,
- old_layer);
- if (workspace == desktop_workspace() ||
- new_workspace == desktop_workspace()) {
- FadeDesktop(child, duration);
- }
- } else {
- SetActiveWorkspace(new_workspace, SWITCH_OTHER);
- }
- } else {
- if (last_show_state == ui::SHOW_STATE_MINIMIZED)
- SetUnminimizingWorkspace(new_workspace ? new_workspace : workspace);
- DCHECK(!old_layer);
+ if (!wm::IsWindowMinimized(child) && workspace != desktop_workspace()) {
+ {
+ base::AutoReset<bool> setter(&in_move_, true);
+ ReparentWindow(child, desktop_workspace()->window(), NULL);
}
+ SetActiveWorkspace(desktop_workspace(), SWITCH_MAXIMIZED_OR_RESTORED);
+ MoveWorkspaceToPendingOrDelete(workspace,
+ child,
+ SWITCH_MAXIMIZED_OR_RESTORED);
}
UpdateShelfVisibility();
}
void WorkspaceManager::OnTrackedByWorkspaceChanged(Workspace* workspace,
aura::Window* window) {
- Workspace* new_workspace = NULL;
- 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 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());
- return;
- }
- new_workspace = CreateWorkspace(true);
- pending_workspaces_.insert(new_workspace);
- } else if (workspace->is_fullscreen()) {
- new_workspace = desktop_workspace();
- } else {
+ if (workspace == active_workspace_)
return;
- }
+
// If the window is active we need to make sure the destination Workspace
// window is showing. Otherwise the window will be parented to a hidden window
// and lose activation.
const bool is_active = wm::IsActiveWindow(window);
if (is_active)
- new_workspace->window()->Show();
- ReparentWindow(window, new_workspace->window(), NULL);
- if (is_active) {
- SetActiveWorkspace(new_workspace, SWITCH_TRACKED_BY_WORKSPACE_CHANGED);
- }
+ workspace->window()->Show();
+ ReparentWindow(window, workspace->window(), NULL);
+ if (is_active)
+ SetActiveWorkspace(workspace, SWITCH_TRACKED_BY_WORKSPACE_CHANGED);
}
} // namespace internal
« 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