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

Side by Side Diff: apps/shell_window.cc

Issue 26751003: Factor out [min|max]_size into ShellWindow::SizeConstraints (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments, fix bug Created 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « apps/shell_window.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "apps/shell_window.h" 5 #include "apps/shell_window.h"
6 6
7 #include "apps/native_app_window.h" 7 #include "apps/native_app_window.h"
8 #include "apps/shell_window_geometry_cache.h" 8 #include "apps/shell_window_geometry_cache.h"
9 #include "apps/shell_window_registry.h" 9 #include "apps/shell_window_registry.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 using web_modal::WebContentsModalDialogManager; 49 using web_modal::WebContentsModalDialogManager;
50 50
51 namespace { 51 namespace {
52 const int kDefaultWidth = 512; 52 const int kDefaultWidth = 512;
53 const int kDefaultHeight = 384; 53 const int kDefaultHeight = 384;
54 54
55 } // namespace 55 } // namespace
56 56
57 namespace apps { 57 namespace apps {
58 58
59 ShellWindow::SizeConstraints::SizeConstraints()
60 : maximum_size_(kUnboundedSize, kUnboundedSize) {
61 }
62
63 ShellWindow::SizeConstraints::SizeConstraints(const gfx::Size& min_size,
64 const gfx::Size& max_size)
65 : minimum_size_(min_size),
66 maximum_size_(max_size) {
67 }
68
69 ShellWindow::SizeConstraints::~SizeConstraints() {}
70
71 gfx::Size ShellWindow::SizeConstraints::ClampSize(gfx::Size size) const {
72 const gfx::Size max_size = GetMaximumSize();
73 if (max_size.width() != kUnboundedSize)
74 size.set_width(std::min(size.width(), GetMaximumSize().width()));
75 if (max_size.height() != kUnboundedSize)
76 size.set_height(std::min(size.height(), GetMaximumSize().height()));
77 size.SetToMax(GetMinimumSize());
78 return size;
79 }
80
81 bool ShellWindow::SizeConstraints::HasMinimumSize() const {
82 return GetMinimumSize().width() != kUnboundedSize ||
83 GetMinimumSize().height() != kUnboundedSize;
84 }
85
86 bool ShellWindow::SizeConstraints::HasMaximumSize() const {
87 const gfx::Size max_size = GetMaximumSize();
88 return max_size.width() != kUnboundedSize ||
89 max_size.height() != kUnboundedSize;
90 }
91
92 bool ShellWindow::SizeConstraints::HasFixedSize() const {
93 return !GetMinimumSize().IsEmpty() && GetMinimumSize() == GetMaximumSize();
94 }
95
96 gfx::Size ShellWindow::SizeConstraints::GetMinimumSize() const {
97 return minimum_size_;
98 }
99
100 gfx::Size ShellWindow::SizeConstraints::GetMaximumSize() const {
101 return gfx::Size(
102 maximum_size_.width() == kUnboundedSize ?
103 kUnboundedSize :
104 std::max(maximum_size_.width(), minimum_size_.width()),
105 maximum_size_.height() == kUnboundedSize ?
106 kUnboundedSize :
107 std::max(maximum_size_.height(), minimum_size_.height()));
108 }
109
59 ShellWindow::CreateParams::CreateParams() 110 ShellWindow::CreateParams::CreateParams()
60 : window_type(ShellWindow::WINDOW_TYPE_DEFAULT), 111 : window_type(ShellWindow::WINDOW_TYPE_DEFAULT),
61 frame(ShellWindow::FRAME_CHROME), 112 frame(ShellWindow::FRAME_CHROME),
62 transparent_background(false), 113 transparent_background(false),
63 bounds(INT_MIN, INT_MIN, 0, 0), 114 bounds(INT_MIN, INT_MIN, 0, 0),
64 creator_process_id(0), 115 creator_process_id(0),
65 state(ui::SHOW_STATE_DEFAULT), 116 state(ui::SHOW_STATE_DEFAULT),
66 hidden(false), 117 hidden(false),
67 resizable(true), 118 resizable(true),
68 focused(true) {} 119 focused(true) {}
(...skipping 25 matching lines...) Expand all
94 WebContents* web_contents = shell_window_contents_->GetWebContents(); 145 WebContents* web_contents = shell_window_contents_->GetWebContents();
95 delegate_->InitWebContents(web_contents); 146 delegate_->InitWebContents(web_contents);
96 WebContentsModalDialogManager::CreateForWebContents(web_contents); 147 WebContentsModalDialogManager::CreateForWebContents(web_contents);
97 148
98 web_contents->SetDelegate(this); 149 web_contents->SetDelegate(this);
99 WebContentsModalDialogManager::FromWebContents(web_contents)-> 150 WebContentsModalDialogManager::FromWebContents(web_contents)->
100 SetDelegate(this); 151 SetDelegate(this);
101 extensions::SetViewType(web_contents, extensions::VIEW_TYPE_APP_SHELL); 152 extensions::SetViewType(web_contents, extensions::VIEW_TYPE_APP_SHELL);
102 153
103 // Initialize the window 154 // Initialize the window
104 window_type_ = params.window_type; 155 CreateParams new_params = LoadDefaultsAndConstrain(params);
105 156 window_type_ = new_params.window_type;
106 gfx::Rect bounds = params.bounds; 157 window_key_ = new_params.window_key;
107
108 if (bounds.width() == 0)
109 bounds.set_width(kDefaultWidth);
110 if (bounds.height() == 0)
111 bounds.set_height(kDefaultHeight);
112
113 // If left and top are left undefined, the native shell window will center
114 // the window on the main screen in a platform-defined manner.
115
116 CreateParams new_params = params;
117
118 // Load cached state if it exists.
119 if (!params.window_key.empty()) {
120 window_key_ = params.window_key;
121
122 ShellWindowGeometryCache* cache = ShellWindowGeometryCache::Get(profile());
123
124 gfx::Rect cached_bounds;
125 gfx::Rect cached_screen_bounds;
126 ui::WindowShowState cached_state = ui::SHOW_STATE_DEFAULT;
127 if (cache->GetGeometry(extension()->id(), params.window_key, &cached_bounds,
128 &cached_screen_bounds, &cached_state)) {
129 // App window has cached screen bounds, make sure it fits on screen in
130 // case the screen resolution changed.
131 gfx::Screen* screen = gfx::Screen::GetNativeScreen();
132 gfx::Display display = screen->GetDisplayMatching(cached_bounds);
133 gfx::Rect current_screen_bounds = display.work_area();
134 AdjustBoundsToBeVisibleOnScreen(cached_bounds,
135 cached_screen_bounds,
136 current_screen_bounds,
137 params.minimum_size,
138 &bounds);
139 new_params.state = cached_state;
140 }
141 }
142
143 gfx::Size& minimum_size = new_params.minimum_size;
144 gfx::Size& maximum_size = new_params.maximum_size;
145
146 // In the case that minimum size > maximum size, we consider the minimum
147 // size to be more important.
148 if (maximum_size.width() && maximum_size.width() < minimum_size.width())
149 maximum_size.set_width(minimum_size.width());
150 if (maximum_size.height() && maximum_size.height() < minimum_size.height())
151 maximum_size.set_height(minimum_size.height());
152
153 if (maximum_size.width() && bounds.width() > maximum_size.width())
154 bounds.set_width(maximum_size.width());
155 if (bounds.width() != INT_MIN && bounds.width() < minimum_size.width())
156 bounds.set_width(minimum_size.width());
157
158 if (maximum_size.height() && bounds.height() > maximum_size.height())
159 bounds.set_height(maximum_size.height());
160 if (bounds.height() != INT_MIN && bounds.height() < minimum_size.height())
161 bounds.set_height(minimum_size.height());
162
163 new_params.bounds = bounds;
164
165 native_app_window_.reset(delegate_->CreateNativeAppWindow(this, new_params)); 158 native_app_window_.reset(delegate_->CreateNativeAppWindow(this, new_params));
166 159
167 if (!new_params.hidden) { 160 if (!new_params.hidden) {
168 if (window_type_is_panel()) 161 if (window_type_is_panel())
169 GetBaseWindow()->ShowInactive(); // Panels are not activated by default. 162 GetBaseWindow()->ShowInactive(); // Panels are not activated by default.
170 else 163 else
171 GetBaseWindow()->Show(); 164 GetBaseWindow()->Show();
172 } 165 }
173 166
174 if (new_params.state == ui::SHOW_STATE_FULLSCREEN) 167 if (new_params.state == ui::SHOW_STATE_FULLSCREEN)
175 Fullscreen(); 168 Fullscreen();
176 else if (new_params.state == ui::SHOW_STATE_MAXIMIZED) 169 else if (new_params.state == ui::SHOW_STATE_MAXIMIZED)
177 Maximize(); 170 Maximize();
178 else if (new_params.state == ui::SHOW_STATE_MINIMIZED) 171 else if (new_params.state == ui::SHOW_STATE_MINIMIZED)
179 Minimize(); 172 Minimize();
180 173
181 OnNativeWindowChanged(); 174 OnNativeWindowChanged();
182 175
183 // When the render view host is changed, the native window needs to know 176 // When the render view host is changed, the native window needs to know
184 // about it in case it has any setup to do to make the renderer appear 177 // about it in case it has any setup to do to make the renderer appear
185 // properly. In particular, on Windows, the view's clickthrough region needs 178 // properly. In particular, on Windows, the view's clickthrough region needs
186 // to be set. 179 // to be set.
187 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, 180 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
188 content::Source<Profile>(profile_)); 181 content::Source<Profile>(profile_));
189 // Close when the browser process is exiting. 182 // Close when the browser process is exiting.
190 registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING, 183 registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING,
191 content::NotificationService::AllSources()); 184 content::NotificationService::AllSources());
192 185
193 shell_window_contents_->LoadContents(params.creator_process_id); 186 shell_window_contents_->LoadContents(new_params.creator_process_id);
194 187
195 // Prevent the browser process from shutting down while this window is open. 188 // Prevent the browser process from shutting down while this window is open.
196 chrome::StartKeepAlive(); 189 chrome::StartKeepAlive();
197 190
198 UpdateExtensionAppIcon(); 191 UpdateExtensionAppIcon();
199 192
200 ShellWindowRegistry::Get(profile_)->AddShellWindow(this); 193 ShellWindowRegistry::Get(profile_)->AddShellWindow(this);
201 } 194 }
202 195
203 ShellWindow::~ShellWindow() { 196 ShellWindow::~ShellWindow() {
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 std::max(current_screen_bounds.x(), 629 std::max(current_screen_bounds.x(),
637 std::min(bounds->x(), 630 std::min(bounds->x(),
638 current_screen_bounds.right() - bounds->width()))); 631 current_screen_bounds.right() - bounds->width())));
639 bounds->set_y( 632 bounds->set_y(
640 std::max(current_screen_bounds.y(), 633 std::max(current_screen_bounds.y(),
641 std::min(bounds->y(), 634 std::min(bounds->y(),
642 current_screen_bounds.bottom() - bounds->height()))); 635 current_screen_bounds.bottom() - bounds->height())));
643 } 636 }
644 } 637 }
645 638
639 ShellWindow::CreateParams ShellWindow::LoadDefaultsAndConstrain(
640 CreateParams params) const {
641 gfx::Rect bounds = params.bounds;
642
643 if (bounds.width() == 0)
644 bounds.set_width(kDefaultWidth);
645 if (bounds.height() == 0)
646 bounds.set_height(kDefaultHeight);
647
648 // If left and top are left undefined, the native shell window will center
649 // the window on the main screen in a platform-defined manner.
650
651 // Load cached state if it exists.
652 if (!params.window_key.empty()) {
653 ShellWindowGeometryCache* cache = ShellWindowGeometryCache::Get(profile());
654
655 gfx::Rect cached_bounds;
656 gfx::Rect cached_screen_bounds;
657 ui::WindowShowState cached_state = ui::SHOW_STATE_DEFAULT;
658 if (cache->GetGeometry(extension()->id(), params.window_key,
659 &cached_bounds, &cached_screen_bounds,
660 &cached_state)) {
661 // App window has cached screen bounds, make sure it fits on screen in
662 // case the screen resolution changed.
663 gfx::Screen* screen = gfx::Screen::GetNativeScreen();
664 gfx::Display display = screen->GetDisplayMatching(cached_bounds);
665 gfx::Rect current_screen_bounds = display.work_area();
666 AdjustBoundsToBeVisibleOnScreen(cached_bounds,
667 cached_screen_bounds,
668 current_screen_bounds,
669 params.minimum_size,
670 &bounds);
671 params.state = cached_state;
672 }
673 }
674
675 SizeConstraints size_constraints(params.minimum_size, params.maximum_size);
676 params.bounds.set_size(size_constraints.ClampSize(bounds.size()));
677 params.minimum_size = size_constraints.GetMinimumSize();
678 params.maximum_size = size_constraints.GetMaximumSize();
679
680 return params;
681 }
682
646 // static 683 // static
647 SkRegion* ShellWindow::RawDraggableRegionsToSkRegion( 684 SkRegion* ShellWindow::RawDraggableRegionsToSkRegion(
648 const std::vector<extensions::DraggableRegion>& regions) { 685 const std::vector<extensions::DraggableRegion>& regions) {
649 SkRegion* sk_region = new SkRegion; 686 SkRegion* sk_region = new SkRegion;
650 for (std::vector<extensions::DraggableRegion>::const_iterator iter = 687 for (std::vector<extensions::DraggableRegion>::const_iterator iter =
651 regions.begin(); 688 regions.begin();
652 iter != regions.end(); ++iter) { 689 iter != regions.end(); ++iter) {
653 const extensions::DraggableRegion& region = *iter; 690 const extensions::DraggableRegion& region = *iter;
654 sk_region->op( 691 sk_region->op(
655 region.bounds.x(), 692 region.bounds.x(),
656 region.bounds.y(), 693 region.bounds.y(),
657 region.bounds.right(), 694 region.bounds.right(),
658 region.bounds.bottom(), 695 region.bounds.bottom(),
659 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); 696 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op);
660 } 697 }
661 return sk_region; 698 return sk_region;
662 } 699 }
663 700
664 } // namespace apps 701 } // namespace apps
OLDNEW
« no previous file with comments | « apps/shell_window.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698