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

Side by Side Diff: chrome/browser/ui/window_sizer/window_sizer_ash.cc

Issue 11085053: Improving window auto management between workspaces (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: git try Created 8 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/window_sizer/window_sizer.h" 5 #include "chrome/browser/ui/window_sizer/window_sizer.h"
6 6
7 #include "ash/shell.h" 7 #include "ash/shell.h"
8 #include "ash/wm/window_cycle_controller.h" 8 #include "ash/wm/window_cycle_controller.h"
9 #include "ash/wm/window_util.h" 9 #include "ash/wm/window_util.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 DCHECK(bounds_in_screen->IsEmpty()); 128 DCHECK(bounds_in_screen->IsEmpty());
129 129
130 ui::WindowShowState passed_show_state = *show_state; 130 ui::WindowShowState passed_show_state = *show_state;
131 if (!GetSavedWindowBounds(bounds_in_screen, show_state)) 131 if (!GetSavedWindowBounds(bounds_in_screen, show_state))
132 GetDefaultWindowBounds(bounds_in_screen); 132 GetDefaultWindowBounds(bounds_in_screen);
133 133
134 if (browser_ && browser_->is_type_tabbed()) { 134 if (browser_ && browser_->is_type_tabbed()) {
135 gfx::Rect work_area = 135 gfx::Rect work_area =
136 monitor_info_provider_->GetMonitorWorkAreaMatching(*bounds_in_screen); 136 monitor_info_provider_->GetMonitorWorkAreaMatching(*bounds_in_screen);
137 // This is a window / app. See if there is no window and try to place it. 137 // This is a window / app. See if there is no window and try to place it.
138 int count = GetNumberOfValidTopLevelBrowserWindows(work_area); 138 int count = GetNumberOfValidTopLevelBrowserWindows(work_area);
sky 2012/10/22 16:40:50 Can't you rip out a lot more of this code?
Mr4D (OOO till 08-26) 2012/10/22 20:27:23 No. Not now. a) our new code only handles 2 windo
139 aura::Window* top_window = GetTopWindow(work_area); 139 aura::Window* top_window = GetTopWindow(work_area);
140 // The window should not be able to reflect on itself. 140 // The window should not be able to reflect on itself.
141 if (browser_->window() && 141 if (browser_->window() &&
142 top_window == browser_->window()->GetNativeWindow()) 142 top_window == browser_->window()->GetNativeWindow())
143 return true; 143 return true;
144 // If there is no valid other window we take the coordinates as is. 144 // If there is no valid other window we take the coordinates as is.
145 if (!count || !top_window) 145 if (!count || !top_window)
146 return true; 146 return true;
147 147
148 bool maximized = ash::wm::IsWindowMaximized(top_window); 148 bool maximized = ash::wm::IsWindowMaximized(top_window);
149 // We ignore the saved show state, but look instead for the top level 149 // We ignore the saved show state, but look instead for the top level
150 // window's show state. 150 // window's show state.
151 if (passed_show_state == ui::SHOW_STATE_DEFAULT) { 151 if (passed_show_state == ui::SHOW_STATE_DEFAULT) {
152 *show_state = maximized ? ui::SHOW_STATE_MAXIMIZED : 152 *show_state = maximized ? ui::SHOW_STATE_MAXIMIZED :
153 ui::SHOW_STATE_DEFAULT; 153 ui::SHOW_STATE_DEFAULT;
154 } 154 }
155 155
156 if (maximized) 156 if (maximized)
157 return true; 157 return true;
158 158
159 gfx::Rect other_bounds_in_screen = top_window->GetBoundsInScreen();
160 bool move_right =
161 other_bounds_in_screen.CenterPoint().x() < work_area.CenterPoint().x();
162
163 // In case we have only one window, we move the other window fully to the
164 // "other side" - making room for this new window.
165 if (count == 1) {
166 gfx::Display display = ash::Shell::GetScreen()->GetDisplayMatching(
167 top_window->GetRootWindow()->GetBoundsInScreen());
168 if (MoveRect(work_area, other_bounds_in_screen, !move_right))
169 top_window->SetBoundsInScreen(other_bounds_in_screen, display);
170 }
171 // Use the size of the other window, and mirror the location to the 159 // Use the size of the other window, and mirror the location to the
172 // opposite side. Then make sure that it is inside our work area 160 // opposite side. Then make sure that it is inside our work area
173 // (if possible). 161 // (if possible).
174 *bounds_in_screen = other_bounds_in_screen; 162 *bounds_in_screen = top_window->GetBoundsInScreen();
163
164 bool move_right =
165 bounds_in_screen->CenterPoint().x() < work_area.CenterPoint().x();
166
175 MoveRect(work_area, *bounds_in_screen, move_right); 167 MoveRect(work_area, *bounds_in_screen, move_right);
176 if (bounds_in_screen->bottom() > work_area.bottom()) 168 if (bounds_in_screen->bottom() > work_area.bottom())
177 bounds_in_screen->set_y(std::max(work_area.y(), 169 bounds_in_screen->set_y(std::max(work_area.y(),
178 work_area.bottom() - bounds_in_screen->height())); 170 work_area.bottom() - bounds_in_screen->height()));
179 return true; 171 return true;
180 } 172 }
181 173
182 return false; 174 return false;
183 } 175 }
184 176
(...skipping 17 matching lines...) Expand all
202 if (default_width > kMaximumWindowWidth) { 194 if (default_width > kMaximumWindowWidth) {
203 // The window should get centered on the screen and not follow the grid. 195 // The window should get centered on the screen and not follow the grid.
204 offset_x = (work_area.width() - kMaximumWindowWidth) / 2; 196 offset_x = (work_area.width() - kMaximumWindowWidth) / 2;
205 default_width = kMaximumWindowWidth; 197 default_width = kMaximumWindowWidth;
206 } 198 }
207 default_bounds->SetRect(work_area.x() + offset_x, 199 default_bounds->SetRect(work_area.x() + offset_x,
208 work_area.y() + kDesktopBorderSize, 200 work_area.y() + kDesktopBorderSize,
209 default_width, 201 default_width,
210 default_height); 202 default_height);
211 } 203 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698