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

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

Issue 11072002: Combined window positioning and show state determiniation in the WindowSizer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 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.cc
diff --git a/chrome/browser/ui/window_sizer/window_sizer.cc b/chrome/browser/ui/window_sizer/window_sizer.cc
index ba299daf4df930caafeac701f7c13eccd3a2cb92..a7161d99145b5f59adc78dfa77a0c617afb9cbc1 100644
--- a/chrome/browser/ui/window_sizer/window_sizer.cc
+++ b/chrome/browser/ui/window_sizer/window_sizer.cc
@@ -14,7 +14,9 @@
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/browser_window_state.h"
#include "chrome/common/pref_names.h"
+#include "chrome/common/chrome_switches.cc"
#include "ui/gfx/screen.h"
+#include "ui/views/widget/widget.h"
sky 2012/10/05 22:54:03 This is cross platform code, don't use views
Mr4D (OOO till 08-26) 2012/10/06 01:10:10 When I checked for minimize that was the only way
// Minimum height of the visible part of a window.
const int kMinVisibleHeight = 30;
@@ -47,7 +49,8 @@ class DefaultStateProvider : public WindowSizer::StateProvider {
// Overridden from WindowSizer::StateProvider:
virtual bool GetPersistentState(gfx::Rect* bounds,
- gfx::Rect* work_area) const {
+ gfx::Rect* work_area,
+ ui::WindowShowState& show_state) const {
DCHECK(bounds);
if (!browser_ || !browser_->profile()->GetPrefs())
@@ -57,11 +60,13 @@ class DefaultStateProvider : public WindowSizer::StateProvider {
const DictionaryValue* wp_pref =
browser_->profile()->GetPrefs()->GetDictionary(window_name.c_str());
int top = 0, left = 0, bottom = 0, right = 0;
+ bool maximized = false;
bool has_prefs = wp_pref &&
wp_pref->GetInteger("top", &top) &&
wp_pref->GetInteger("left", &left) &&
wp_pref->GetInteger("bottom", &bottom) &&
- wp_pref->GetInteger("right", &right);
+ wp_pref->GetInteger("right", &right) &&
+ wp_pref->GetBoolean("maximized", &maximized);
bounds->SetRect(left, top, std::max(0, right - left),
std::max(0, bottom - top));
@@ -74,6 +79,8 @@ class DefaultStateProvider : public WindowSizer::StateProvider {
wp_pref->GetInteger("work_area_left", &work_area_left);
wp_pref->GetInteger("work_area_bottom", &work_area_bottom);
wp_pref->GetInteger("work_area_right", &work_area_right);
+ if (show_state == ui::SHOW_STATE_DEFAULT && maximized)
+ show_state = ui::SHOW_STATE_MAXIMIZED;
}
work_area->SetRect(work_area_left, work_area_top,
std::max(0, work_area_right - work_area_left),
@@ -82,7 +89,8 @@ class DefaultStateProvider : public WindowSizer::StateProvider {
return has_prefs;
}
- virtual bool GetLastActiveWindowState(gfx::Rect* bounds) const {
+ virtual bool GetLastActiveWindowState(gfx::Rect* bounds,
+ ui::WindowShowState& show_state) const {
// Applications are always restored with the same position.
if (!app_name_.empty())
return false;
@@ -109,6 +117,10 @@ class DefaultStateProvider : public WindowSizer::StateProvider {
if (window) {
*bounds = window->GetRestoredBounds();
+ bool maximized = views::Widget::GetWidgetForNativeWindow(
sky 2012/10/05 22:54:03 You want window->IsMaximized(), which works on all
Mr4D (OOO till 08-26) 2012/10/06 01:10:10 This is now funny. I was looking all over the syst
+ window->GetNativeWindow())->IsMaximized();
+ if (show_state == ui::SHOW_STATE_DEFAULT && maximized)
+ show_state = ui::SHOW_STATE_MAXIMIZED;
return true;
}
@@ -153,26 +165,46 @@ WindowSizer::~WindowSizer() {
}
// static
+void WindowSizer::GetBrowserWindowBoundsAndShowState(
+ const std::string& app_name,
+ const gfx::Rect& specified_bounds,
+ const Browser* browser,
+ gfx::Rect* window_bounds,
+ ui::WindowShowState& show_state) {
+ const WindowSizer sizer(new DefaultStateProvider(app_name, browser), browser);
+ sizer.DetermineWindowBoundsAndShowState(specified_bounds,
+ window_bounds,
+ show_state);
+}
+
+// static
void WindowSizer::GetBrowserWindowBounds(const std::string& app_name,
const gfx::Rect& specified_bounds,
const Browser* browser,
gfx::Rect* window_bounds) {
const WindowSizer sizer(new DefaultStateProvider(app_name, browser), browser);
- sizer.DetermineWindowBounds(specified_bounds, window_bounds);
+ ui::WindowShowState show_state;
+ sizer.DetermineWindowBoundsAndShowState(specified_bounds,
+ window_bounds,
+ show_state);
}
///////////////////////////////////////////////////////////////////////////////
// WindowSizer, private:
-void WindowSizer::DetermineWindowBounds(const gfx::Rect& specified_bounds,
- gfx::Rect* bounds) const {
+void WindowSizer::DetermineWindowBoundsAndShowState(
+ const gfx::Rect& specified_bounds,
+ gfx::Rect* bounds,
+ ui::WindowShowState& show_state) const {
+ // Pre-populate the window state with our default.
+ show_state = GetWindowDefaultShowState();
*bounds = specified_bounds;
if (bounds->IsEmpty()) {
- if (GetBoundsOverride(specified_bounds, bounds))
+ if (GetBoundsOverride(specified_bounds, bounds, show_state))
return;
// See if there's saved placement information.
- if (!GetLastWindowBounds(bounds)) {
- if (!GetSavedWindowBounds(bounds)) {
+ if (!GetLastWindowBounds(bounds, show_state)) {
+ if (!GetSavedWindowBounds(bounds, show_state)) {
// No saved placement, figure out some sensible default size based on
// the user's screen size.
GetDefaultWindowBounds(bounds);
@@ -192,10 +224,11 @@ void WindowSizer::DetermineWindowBounds(const gfx::Rect& specified_bounds,
}
}
-bool WindowSizer::GetLastWindowBounds(gfx::Rect* bounds) const {
+bool WindowSizer::GetLastWindowBounds(gfx::Rect* bounds,
+ ui::WindowShowState& show_state) const {
DCHECK(bounds);
if (!state_provider_.get() ||
- !state_provider_->GetLastActiveWindowState(bounds))
+ !state_provider_->GetLastActiveWindowState(bounds, show_state))
return false;
gfx::Rect last_window_bounds = *bounds;
bounds->Offset(kWindowTilePixels, kWindowTilePixels);
@@ -205,11 +238,14 @@ bool WindowSizer::GetLastWindowBounds(gfx::Rect* bounds) const {
return true;
}
-bool WindowSizer::GetSavedWindowBounds(gfx::Rect* bounds) const {
+bool WindowSizer::GetSavedWindowBounds(gfx::Rect* bounds,
+ ui::WindowShowState& show_state) const {
DCHECK(bounds);
gfx::Rect saved_work_area;
if (!state_provider_.get() ||
- !state_provider_->GetPersistentState(bounds, &saved_work_area))
+ !state_provider_->GetPersistentState(bounds,
+ &saved_work_area,
+ show_state))
return false;
AdjustBoundsToBeVisibleOnMonitorContaining(*bounds, saved_work_area, bounds);
return true;
@@ -332,11 +368,38 @@ void WindowSizer::AdjustBoundsToBeVisibleOnMonitorContaining(
bool WindowSizer::GetBoundsOverride(
const gfx::Rect& specified_bounds,
- gfx::Rect* bounds) const {
+ gfx::Rect* bounds,
+ ui::WindowShowState& show_state) const {
#if defined(USE_ASH)
// TODO(beng): insufficient but currently necessary. http://crbug.com/133312
if (chrome::ShouldOpenAshOnStartup())
- return GetBoundsOverrideAsh(specified_bounds, bounds);
+ return GetBoundsOverrideAsh(specified_bounds, bounds, show_state);
#endif
return false;
}
+
+ui::WindowShowState WindowSizer::GetWindowDefaultShowState() const {
+ if (!browser_)
+ return ui::SHOW_STATE_DEFAULT;
+
+ // Only tabbed browsers use the command line or preference state, with the
+ // exception of devtools.
+ bool show_state = !browser_->is_type_tabbed() && !browser_->is_devtools();
+
+#if defined(USE_AURA)
+ // We use the apps save state on aura.
+ show_state &= !browser_->is_app();
+#endif
+
+ if (show_state)
+ return browser_->initial_show_state();
+
+ if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kStartMaximized))
+ return ui::SHOW_STATE_MAXIMIZED;
+
+ if (browser_->initial_show_state() != ui::SHOW_STATE_DEFAULT)
+ return browser_->initial_show_state();
+
+ // Otherwise we use the default which can be overridden later on.
+ return ui::SHOW_STATE_DEFAULT;
+}

Powered by Google App Engine
This is Rietveld 408576698