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

Unified Diff: chrome/browser/ui/window_sizer/window_sizer_ash.cc

Issue 23205027: Correctly restore the auto managed window to the original bounds when becoming single window (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 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: chrome/browser/ui/window_sizer/window_sizer_ash.cc
diff --git a/chrome/browser/ui/window_sizer/window_sizer_ash.cc b/chrome/browser/ui/window_sizer/window_sizer_ash.cc
index 144cd075a6eb175780cadfca90a1506885218af4..aa8b535972ccad1d26db9d3e3262d1f8b58e0e18 100644
--- a/chrome/browser/ui/window_sizer/window_sizer_ash.cc
+++ b/chrome/browser/ui/window_sizer/window_sizer_ash.cc
@@ -8,6 +8,7 @@
#include "ash/shell.h"
#include "ash/wm/mru_window_tracker.h"
#include "ash/wm/window_util.h"
+#include "ash/wm/workspace/auto_window_management.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "chrome/browser/browser_process.h"
@@ -40,66 +41,6 @@ bool IsValidBrowser(Browser* browser, const gfx::Rect& bounds_in_screen) {
browser->window()->GetNativeWindow()->GetBoundsInScreen()));
}
-// Check if the window was not created as popup or as panel, it is
-// on the screen defined by |bounds_in_screen| and visible.
-bool IsValidToplevelWindow(aura::Window* window,
- const gfx::Rect& bounds_in_screen) {
- const BrowserList* ash_browser_list =
- BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_ASH);
- for (BrowserList::const_iterator iter = ash_browser_list->begin();
- iter != ash_browser_list->end();
- ++iter) {
- Browser* browser = *iter;
- if (browser && browser->window() &&
- browser->window()->GetNativeWindow() == window) {
- return IsValidBrowser(browser, bounds_in_screen);
- }
- }
- // A window which has no browser associated with it is probably not a window
- // of which we want to copy the size from.
- return false;
-}
-
-// Get the first open (non minimized) window which is on the screen defined
-// by |bounds_in_screen| and visible.
-aura::Window* GetTopWindow(const gfx::Rect& bounds_in_screen) {
- // Get the active window.
- aura::Window* window = ash::wm::GetActiveWindow();
- if (window && window->type() == aura::client::WINDOW_TYPE_NORMAL &&
- window->IsVisible() && IsValidToplevelWindow(window, bounds_in_screen)) {
- return window;
- }
-
- // Get a list of all windows.
- const std::vector<aura::Window*> windows =
- ash::MruWindowTracker::BuildWindowList(false);
-
- if (windows.empty())
- return NULL;
-
- aura::Window::Windows::const_iterator iter = windows.begin();
- // Find the index of the current window.
- if (window)
- iter = std::find(windows.begin(), windows.end(), window);
-
- int index = (iter == windows.end()) ? 0 : (iter - windows.begin());
-
- // Scan the cycle list backwards to see which is the second topmost window
- // (and so on). Note that we might cycle a few indices twice if there is no
- // suitable window. However - since the list is fairly small this should be
- // very fast anyways.
- for (int i = index + windows.size(); i >= 0; i--) {
- aura::Window* window = windows[i % windows.size()];
- if (window && window->type() == aura::client::WINDOW_TYPE_NORMAL &&
- bounds_in_screen.Intersects(window->GetBoundsInScreen()) &&
- window->IsVisible()
- && IsValidToplevelWindow(window, bounds_in_screen)) {
- return window;
- }
- }
- return NULL;
-}
-
// Return the number of valid top level windows on the screen defined by
// the |bounds_in_screen| rectangle.
int GetNumberOfValidTopLevelBrowserWindows(const gfx::Rect& bounds_in_screen) {
@@ -180,13 +121,12 @@ bool WindowSizer::GetBoundsOverrideAsh(gfx::Rect* bounds_in_screen,
if (browser_ && browser_->is_type_tabbed()) {
aura::RootWindow* active = ash::Shell::GetActiveRootWindow();
// Always open new window in the active display.
- gfx::Rect active_area = active->GetBoundsInScreen();
gfx::Rect work_area =
- screen_->GetDisplayMatching(active_area).work_area();
+ screen_->GetDisplayMatching(active->GetBoundsInScreen()).work_area();
// This is a window / app. See if there is no window and try to place it.
int count = GetNumberOfValidTopLevelBrowserWindows(work_area);
- aura::Window* top_window = GetTopWindow(work_area);
+ aura::Window* top_window = ash::GetTopWindowForNewWindow(active);
// Our window should not have any impact if we are already on top.
if (browser_->window() &&
top_window == browser_->window()->GetNativeWindow())
@@ -220,16 +160,10 @@ bool WindowSizer::GetBoundsOverrideAsh(gfx::Rect* bounds_in_screen,
if (maximized)
return true;
- // Use the size of the other window, and mirror the location to the
- // opposite side. Then make sure that it is inside our work area
- // (if possible).
+ // Use the size of the other window. The window's bound will be rearranged
+ // in ash::WorkspaceLayoutManager using this location.
*bounds_in_screen = top_window->GetBoundsInScreen();
- bool move_right =
- bounds_in_screen->CenterPoint().x() < work_area.CenterPoint().x();
-
- MoveRect(work_area, *bounds_in_screen, move_right);
- bounds_in_screen->AdjustToFit(work_area);
return true;
}

Powered by Google App Engine
This is Rietveld 408576698