summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authortdanderson <tdanderson@chromium.org>2015-04-17 17:43:27 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-18 00:43:43 +0000
commitb7803ca440c9ffb753bf6ae1a4a8d6bab0d37e5a (patch)
treef73a2b3b27b44c26e83035ef38e0a75711105480 /ash
parentcb655c2ca0a46c9402c65e74ef736037ed6bd3a8 (diff)
downloadchromium_src-b7803ca440c9ffb753bf6ae1a4a8d6bab0d37e5a.zip
chromium_src-b7803ca440c9ffb753bf6ae1a4a8d6bab0d37e5a.tar.gz
chromium_src-b7803ca440c9ffb753bf6ae1a4a8d6bab0d37e5a.tar.bz2
Make always-on-top windows free-floating in Ash maximize mode
Currently windows in maximize mode are forced to be maximized/centered, non-draggable, and non-resizable. Applying these properties for always-on-top windows leads to occlusion of content in other windows and thus gives a poor user experience. This CL changes the behaviour of MaximizeModeWindowManager to never manage windows with the always-on-top property. As a result, any such windows will be free-floating like in regular Ash. BUG=458141 TEST=MaximizeModeWindowManagerTest.AlwaysOnTopWindows Review URL: https://codereview.chromium.org/1063613003 Cr-Commit-Position: refs/heads/master@{#325749}
Diffstat (limited to 'ash')
-rw-r--r--ash/wm/maximize_mode/maximize_mode_window_manager.cc19
-rw-r--r--ash/wm/maximize_mode/maximize_mode_window_manager.h3
-rw-r--r--ash/wm/maximize_mode/maximize_mode_window_manager_unittest.cc70
3 files changed, 91 insertions, 1 deletions
diff --git a/ash/wm/maximize_mode/maximize_mode_window_manager.cc b/ash/wm/maximize_mode/maximize_mode_window_manager.cc
index e4c91f7..28a71d0 100644
--- a/ash/wm/maximize_mode/maximize_mode_window_manager.cc
+++ b/ash/wm/maximize_mode/maximize_mode_window_manager.cc
@@ -17,6 +17,7 @@
#include "ash/wm/wm_event.h"
#include "ash/wm/workspace_controller.h"
#include "base/command_line.h"
+#include "ui/aura/client/aura_constants.h"
#include "ui/aura/window.h"
#include "ui/gfx/screen.h"
@@ -122,6 +123,16 @@ void MaximizeModeWindowManager::OnWindowAdded(aura::Window* window) {
}
}
+void MaximizeModeWindowManager::OnWindowPropertyChanged(aura::Window* window,
+ const void* key,
+ intptr_t old) {
+ // Stop managing |window| if the always-on-top property is added.
+ if (key == aura::client::kAlwaysOnTopKey &&
+ window->GetProperty(aura::client::kAlwaysOnTopKey)) {
+ ForgetWindow(window);
+ }
+}
+
void MaximizeModeWindowManager::OnWindowBoundsChanged(
aura::Window* window,
const gfx::Rect& old_bounds,
@@ -236,13 +247,19 @@ void MaximizeModeWindowManager::ForgetWindow(aura::Window* window) {
window->RemoveObserver(this);
// By telling the state object to revert, it will switch back the old
- // State object and destroy itself, calling WindowStateDerstroyed().
+ // State object and destroy itself, calling WindowStateDestroyed().
it->second->LeaveMaximizeMode(wm::GetWindowState(it->first));
DCHECK(window_state_map_.find(window) == window_state_map_.end());
}
bool MaximizeModeWindowManager::ShouldHandleWindow(aura::Window* window) {
DCHECK(window);
+
+ // Windows with the always-on-top property should be free-floating and thus
+ // not managed by us.
+ if (window->GetProperty(aura::client::kAlwaysOnTopKey))
+ return false;
+
return window->type() == ui::wm::WINDOW_TYPE_NORMAL;
}
diff --git a/ash/wm/maximize_mode/maximize_mode_window_manager.h b/ash/wm/maximize_mode/maximize_mode_window_manager.h
index b29bd6d..be64c6d 100644
--- a/ash/wm/maximize_mode/maximize_mode_window_manager.h
+++ b/ash/wm/maximize_mode/maximize_mode_window_manager.h
@@ -58,6 +58,9 @@ class ASH_EXPORT MaximizeModeWindowManager : public aura::WindowObserver,
// Overridden from WindowObserver:
void OnWindowDestroying(aura::Window* window) override;
void OnWindowAdded(aura::Window* window) override;
+ void OnWindowPropertyChanged(aura::Window* window,
+ const void* key,
+ intptr_t old) override;
void OnWindowBoundsChanged(aura::Window* window,
const gfx::Rect& old_bounds,
const gfx::Rect& new_bounds) override;
diff --git a/ash/wm/maximize_mode/maximize_mode_window_manager_unittest.cc b/ash/wm/maximize_mode/maximize_mode_window_manager_unittest.cc
index a57fa75..8011efe 100644
--- a/ash/wm/maximize_mode/maximize_mode_window_manager_unittest.cc
+++ b/ash/wm/maximize_mode/maximize_mode_window_manager_unittest.cc
@@ -1297,6 +1297,76 @@ TEST_F(MaximizeModeWindowManagerTest,
DestroyMaximizeModeWindowManager();
}
+// Tests that windows with the always-on-top property are not managed by
+// the MaximizeModeWindowManager while maximize mode is engaged (i.e.,
+// they remain free-floating).
+TEST_F(MaximizeModeWindowManagerTest, AlwaysOnTopWindows) {
+ gfx::Rect rect1(10, 10, 200, 50);
+ gfx::Rect rect2(20, 140, 100, 100);
+
+ // Create two windows with the always-on-top property.
+ scoped_ptr<aura::Window> w1(CreateWindow(ui::wm::WINDOW_TYPE_NORMAL, rect1));
+ scoped_ptr<aura::Window> w2(
+ CreateFixedSizeNonMaximizableWindow(ui::wm::WINDOW_TYPE_NORMAL, rect2));
+ w1->SetProperty(aura::client::kAlwaysOnTopKey, true);
+ w2->SetProperty(aura::client::kAlwaysOnTopKey, true);
+ EXPECT_FALSE(wm::GetWindowState(w1.get())->IsMaximized());
+ EXPECT_FALSE(wm::GetWindowState(w2.get())->IsMaximized());
+ EXPECT_EQ(rect1.ToString(), w1->bounds().ToString());
+ EXPECT_EQ(rect2.ToString(), w2->bounds().ToString());
+ EXPECT_TRUE(wm::GetWindowState(w1.get())->can_be_dragged());
+ EXPECT_TRUE(wm::GetWindowState(w2.get())->can_be_dragged());
+
+ // Enter maximize mode. Neither window should be managed because they have
+ // the always-on-top property set, which means that none of their properties
+ // should change.
+ ash::MaximizeModeWindowManager* manager = CreateMaximizeModeWindowManager();
+ ASSERT_TRUE(manager);
+ EXPECT_EQ(0, manager->GetNumberOfManagedWindows());
+ EXPECT_FALSE(wm::GetWindowState(w1.get())->IsMaximized());
+ EXPECT_FALSE(wm::GetWindowState(w2.get())->IsMaximized());
+ EXPECT_EQ(rect1.ToString(), w1->bounds().ToString());
+ EXPECT_EQ(rect2.ToString(), w2->bounds().ToString());
+ EXPECT_TRUE(wm::GetWindowState(w1.get())->can_be_dragged());
+ EXPECT_TRUE(wm::GetWindowState(w2.get())->can_be_dragged());
+
+ // Remove the always-on-top property from both windows while in maximize
+ // mode. The windows should become managed, which means they should be
+ // maximized/centered and no longer be draggable.
+ w1->SetProperty(aura::client::kAlwaysOnTopKey, false);
+ w2->SetProperty(aura::client::kAlwaysOnTopKey, false);
+ EXPECT_EQ(2, manager->GetNumberOfManagedWindows());
+ EXPECT_TRUE(wm::GetWindowState(w1.get())->IsMaximized());
+ EXPECT_FALSE(wm::GetWindowState(w2.get())->IsMaximized());
+ EXPECT_NE(rect1.origin().ToString(), w1->bounds().origin().ToString());
+ EXPECT_NE(rect1.size().ToString(), w1->bounds().size().ToString());
+ EXPECT_NE(rect2.origin().ToString(), w2->bounds().origin().ToString());
+ EXPECT_EQ(rect2.size().ToString(), w2->bounds().size().ToString());
+ EXPECT_FALSE(wm::GetWindowState(w1.get())->can_be_dragged());
+ EXPECT_FALSE(wm::GetWindowState(w2.get())->can_be_dragged());
+
+ // Applying the always-on-top property to both windows while in maximize
+ // mode should cause both windows to return to their original size,
+ // position, and state.
+ w1->SetProperty(aura::client::kAlwaysOnTopKey, true);
+ w2->SetProperty(aura::client::kAlwaysOnTopKey, true);
+ EXPECT_EQ(0, manager->GetNumberOfManagedWindows());
+ EXPECT_FALSE(wm::GetWindowState(w1.get())->IsMaximized());
+ EXPECT_FALSE(wm::GetWindowState(w2.get())->IsMaximized());
+ EXPECT_EQ(rect1.ToString(), w1->bounds().ToString());
+ EXPECT_EQ(rect2.ToString(), w2->bounds().ToString());
+ EXPECT_TRUE(wm::GetWindowState(w1.get())->can_be_dragged());
+ EXPECT_TRUE(wm::GetWindowState(w2.get())->can_be_dragged());
+
+ // The always-on-top windows should not change when leaving maximize mode.
+ DestroyMaximizeModeWindowManager();
+ EXPECT_FALSE(wm::GetWindowState(w1.get())->IsMaximized());
+ EXPECT_FALSE(wm::GetWindowState(w2.get())->IsMaximized());
+ EXPECT_EQ(rect1.ToString(), w1->bounds().ToString());
+ EXPECT_EQ(rect2.ToString(), w2->bounds().ToString());
+ EXPECT_TRUE(wm::GetWindowState(w1.get())->can_be_dragged());
+ EXPECT_TRUE(wm::GetWindowState(w2.get())->can_be_dragged());
+}
#endif // OS_WIN
} // namespace ash