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

Unified Diff: ash/wm/maximize_mode/maximize_mode_window_manager.cc

Issue 169643005: Adding a gray semi transparent backdrop behind the topmost window within the default container (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added unit tests Created 6 years, 10 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
Index: ash/wm/maximize_mode/maximize_mode_window_manager.cc
diff --git a/ash/wm/maximize_mode/maximize_mode_window_manager.cc b/ash/wm/maximize_mode/maximize_mode_window_manager.cc
index 6360450d36cbd9f62e045c0f8147dd037646d6a2..feb668c6da1e71789d562768bda73f850eabae78 100644
--- a/ash/wm/maximize_mode/maximize_mode_window_manager.cc
+++ b/ash/wm/maximize_mode/maximize_mode_window_manager.cc
@@ -4,9 +4,11 @@
#include "ash/wm/maximize_mode/maximize_mode_window_manager.h"
+#include "ash/root_window_controller.h"
#include "ash/shell.h"
#include "ash/switchable_windows.h"
#include "ash/wm/mru_window_tracker.h"
+#include "ash/wm/workspace_controller.h"
#include "ui/aura/window.h"
#include "ui/gfx/screen.h"
@@ -14,7 +16,9 @@ namespace ash {
namespace internal {
MaximizeModeWindowManager::~MaximizeModeWindowManager() {
+ Shell::GetInstance()->RemoveShellObserver(this);
Shell::GetScreen()->RemoveObserver(this);
+ EnableBackdropBehindTopWindowOnEachDisplay(false);
RemoveWindowCreationObservers();
RestoreAllWindows();
}
@@ -23,6 +27,22 @@ int MaximizeModeWindowManager::GetNumberOfManagedWindows() {
return initial_show_state_.size();
}
+void MaximizeModeWindowManager::OnOverviewModeStarted() {
+ if (backdrops_hidden_)
+ return;
+
+ EnableBackdropBehindTopWindowOnEachDisplay(false);
+ backdrops_hidden_ = true;
+}
+
+void MaximizeModeWindowManager::OnOverviewModeEnded() {
+ if (!backdrops_hidden_)
+ return;
+
+ backdrops_hidden_ = false;
+ EnableBackdropBehindTopWindowOnEachDisplay(true);
+}
+
void MaximizeModeWindowManager::OnWindowDestroying(aura::Window* window) {
// If a known window gets destroyed we need to remove all knowledge about it.
if (!IsContainerWindow(window))
@@ -58,25 +78,28 @@ void MaximizeModeWindowManager::OnDisplayBoundsChanged(
}
void MaximizeModeWindowManager::OnDisplayAdded(const gfx::Display& display) {
- RemoveWindowCreationObservers();
- AddWindowCreationObservers();
-
+ DisplayConfigurationChanged();
}
+
void MaximizeModeWindowManager::OnDisplayRemoved(const gfx::Display& display) {
- RemoveWindowCreationObservers();
- AddWindowCreationObservers();
+ DisplayConfigurationChanged();
}
-MaximizeModeWindowManager::MaximizeModeWindowManager() {
+MaximizeModeWindowManager::MaximizeModeWindowManager()
+ : backdrops_hidden_(false) {
MaximizeAllWindows();
AddWindowCreationObservers();
+ EnableBackdropBehindTopWindowOnEachDisplay(true);
Shell::GetScreen()->AddObserver(this);
+ Shell::GetInstance()->AddShellObserver(this);
}
void MaximizeModeWindowManager::MaximizeAllWindows() {
MruWindowTracker::WindowList windows =
MruWindowTracker::BuildWindowList(false);
// Add all existing Mru windows.
+ // TODO(skuhne): The MRUWindowTracker also includes always on top and panel
+ // windows. Panel windows shouldn't be a problem, but always on top might be.
for (MruWindowTracker::WindowList::iterator window = windows.begin();
window != windows.end(); ++window) {
MaximizeAndTrackWindow(*window);
@@ -116,7 +139,6 @@ void MaximizeModeWindowManager::MaximizeAndTrackWindow(
else
window_state->SetRestoreBoundsInScreen(initial_rect);
CenterWindow(window);
- // TODO(skuhne): Add a background cover layer.
} else {
// Minimized windows can remain as they are.
if (state != ui::SHOW_STATE_MINIMIZED)
@@ -131,7 +153,6 @@ void MaximizeModeWindowManager::RestoreAndForgetWindow(
// Restore window if it can be restored.
if (state != ui::SHOW_STATE_MAXIMIZED) {
if (!CanMaximize(window)) {
- // TODO(skuhne): Remove the background cover layer.
ash::wm::WindowState* window_state = ash::wm::GetWindowState(window);
DCHECK(window_state->HasRestoreBounds());
gfx::Rect initial_bounds =
@@ -193,6 +214,7 @@ void MaximizeModeWindowManager::AddWindowCreationObservers() {
aura::Window::Windows root_windows = Shell::GetAllRootWindows();
for (aura::Window::Windows::const_iterator iter = root_windows.begin();
iter != root_windows.end(); ++iter) {
+ // TODO(skuhne): We might only need the DefaultContainer here.
for (size_t i = 0; i < kSwitchableWindowContainerIdsLength; ++i) {
aura::Window* container = Shell::GetContainer(*iter,
kSwitchableWindowContainerIds[i]);
@@ -213,10 +235,32 @@ void MaximizeModeWindowManager::RemoveWindowCreationObservers() {
observed_container_windows_.clear();
}
+void MaximizeModeWindowManager::EnableBackdropBehindTopWindowOnEachDisplay(
+ bool enable) {
+ if (backdrops_hidden_)
+ return;
+ // Inform the WorkspaceLayoutManager that we want to show a backdrop behind
+ // the topmost window of its container.
+ Shell::RootWindowControllerList controllers =
+ Shell::GetAllRootWindowControllers();
+ for (Shell::RootWindowControllerList::iterator iter = controllers.begin();
+ iter != controllers.end(); ++iter) {
+ RootWindowController* controller = *iter;
+ controller->workspace_controller()->AddBackdropBehindTopWindow(enable);
+ }
+}
+
bool MaximizeModeWindowManager::IsContainerWindow(aura::Window* window) {
return observed_container_windows_.find(window) !=
observed_container_windows_.end();
}
+void MaximizeModeWindowManager::DisplayConfigurationChanged() {
+ EnableBackdropBehindTopWindowOnEachDisplay(false);
+ RemoveWindowCreationObservers();
+ AddWindowCreationObservers();
+ EnableBackdropBehindTopWindowOnEachDisplay(true);
+}
+
} // namespace internal
} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698