OLD | NEW |
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/shell_window_geometry_cache.h" | 7 #include "apps/shell_window_geometry_cache.h" |
8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "base/values.h" | 10 #include "base/values.h" |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 gfx::Rect bounds = params.bounds; | 101 gfx::Rect bounds = params.bounds; |
102 | 102 |
103 if (bounds.width() == 0) | 103 if (bounds.width() == 0) |
104 bounds.set_width(kDefaultWidth); | 104 bounds.set_width(kDefaultWidth); |
105 if (bounds.height() == 0) | 105 if (bounds.height() == 0) |
106 bounds.set_height(kDefaultHeight); | 106 bounds.set_height(kDefaultHeight); |
107 | 107 |
108 // If left and top are left undefined, the native shell window will center | 108 // If left and top are left undefined, the native shell window will center |
109 // the window on the main screen in a platform-defined manner. | 109 // the window on the main screen in a platform-defined manner. |
110 | 110 |
111 ui::WindowShowState cached_state = ui::SHOW_STATE_DEFAULT; | 111 CreateParams new_params = params; |
| 112 |
| 113 // Load cached state if it exists. |
112 if (!params.window_key.empty()) { | 114 if (!params.window_key.empty()) { |
113 window_key_ = params.window_key; | 115 window_key_ = params.window_key; |
114 | 116 |
115 ShellWindowGeometryCache* cache = ShellWindowGeometryCache::Get(profile()); | 117 ShellWindowGeometryCache* cache = ShellWindowGeometryCache::Get(profile()); |
116 | 118 |
117 gfx::Rect cached_bounds; | 119 gfx::Rect cached_bounds; |
118 gfx::Rect cached_screen_bounds; | 120 gfx::Rect cached_screen_bounds; |
| 121 ui::WindowShowState cached_state = ui::SHOW_STATE_DEFAULT; |
119 if (cache->GetGeometry(extension()->id(), params.window_key, &cached_bounds, | 122 if (cache->GetGeometry(extension()->id(), params.window_key, &cached_bounds, |
120 &cached_screen_bounds, &cached_state)) { | 123 &cached_screen_bounds, &cached_state)) { |
121 bounds = cached_bounds; | |
122 // App window has cached screen bounds, make sure it fits on screen in | 124 // App window has cached screen bounds, make sure it fits on screen in |
123 // case the screen resolution changed. | 125 // case the screen resolution changed. |
124 if (!cached_screen_bounds.IsEmpty()) { | 126 AdjustBoundsToBeVisibleOnScreen(cached_bounds, |
125 gfx::Screen* screen = gfx::Screen::GetNativeScreen(); | 127 cached_screen_bounds, |
126 gfx::Display display = screen->GetDisplayMatching(cached_bounds); | 128 params.minimum_size, |
127 gfx::Rect current_screen_bounds = display.work_area(); | 129 &bounds); |
128 AdjustBoundsToBeVisibleOnScreen(cached_bounds, | 130 new_params.state = cached_state; |
129 cached_screen_bounds, | |
130 current_screen_bounds, | |
131 params.minimum_size, | |
132 &bounds); | |
133 } | |
134 } | 131 } |
135 } | 132 } |
136 | 133 |
137 CreateParams new_params = params; | |
138 | |
139 gfx::Size& minimum_size = new_params.minimum_size; | 134 gfx::Size& minimum_size = new_params.minimum_size; |
140 gfx::Size& maximum_size = new_params.maximum_size; | 135 gfx::Size& maximum_size = new_params.maximum_size; |
141 | 136 |
142 // In the case that minimum size > maximum size, we consider the minimum | 137 // In the case that minimum size > maximum size, we consider the minimum |
143 // size to be more important. | 138 // size to be more important. |
144 if (maximum_size.width() && maximum_size.width() < minimum_size.width()) | 139 if (maximum_size.width() && maximum_size.width() < minimum_size.width()) |
145 maximum_size.set_width(minimum_size.width()); | 140 maximum_size.set_width(minimum_size.width()); |
146 if (maximum_size.height() && maximum_size.height() < minimum_size.height()) | 141 if (maximum_size.height() && maximum_size.height() < minimum_size.height()) |
147 maximum_size.set_height(minimum_size.height()); | 142 maximum_size.set_height(minimum_size.height()); |
148 | 143 |
149 if (maximum_size.width() && bounds.width() > maximum_size.width()) | 144 if (maximum_size.width() && bounds.width() > maximum_size.width()) |
150 bounds.set_width(maximum_size.width()); | 145 bounds.set_width(maximum_size.width()); |
151 if (bounds.width() != INT_MIN && bounds.width() < minimum_size.width()) | 146 if (bounds.width() != INT_MIN && bounds.width() < minimum_size.width()) |
152 bounds.set_width(minimum_size.width()); | 147 bounds.set_width(minimum_size.width()); |
153 | 148 |
154 if (maximum_size.height() && bounds.height() > maximum_size.height()) | 149 if (maximum_size.height() && bounds.height() > maximum_size.height()) |
155 bounds.set_height(maximum_size.height()); | 150 bounds.set_height(maximum_size.height()); |
156 if (bounds.height() != INT_MIN && bounds.height() < minimum_size.height()) | 151 if (bounds.height() != INT_MIN && bounds.height() < minimum_size.height()) |
157 bounds.set_height(minimum_size.height()); | 152 bounds.set_height(minimum_size.height()); |
158 | 153 |
159 new_params.bounds = bounds; | 154 new_params.bounds = bounds; |
160 | 155 |
161 if (cached_state != ui::SHOW_STATE_DEFAULT) | |
162 new_params.state = cached_state; | |
163 | |
164 native_app_window_.reset(NativeAppWindow::Create(this, new_params)); | 156 native_app_window_.reset(NativeAppWindow::Create(this, new_params)); |
165 | 157 |
166 if (!new_params.hidden) { | 158 if (!new_params.hidden) { |
167 if (window_type_is_panel()) | 159 if (window_type_is_panel()) |
168 GetBaseWindow()->ShowInactive(); // Panels are not activated by default. | 160 GetBaseWindow()->ShowInactive(); // Panels are not activated by default. |
169 else | 161 else |
170 GetBaseWindow()->Show(); | 162 GetBaseWindow()->Show(); |
171 } | 163 } |
172 | 164 |
173 if (new_params.state == ui::SHOW_STATE_FULLSCREEN) | 165 if (new_params.state == ui::SHOW_STATE_FULLSCREEN) |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 cache->SaveGeometry(extension()->id(), | 571 cache->SaveGeometry(extension()->id(), |
580 window_key_, | 572 window_key_, |
581 bounds, | 573 bounds, |
582 screen_bounds, | 574 screen_bounds, |
583 window_state); | 575 window_state); |
584 } | 576 } |
585 | 577 |
586 void ShellWindow::AdjustBoundsToBeVisibleOnScreen( | 578 void ShellWindow::AdjustBoundsToBeVisibleOnScreen( |
587 const gfx::Rect& cached_bounds, | 579 const gfx::Rect& cached_bounds, |
588 const gfx::Rect& cached_screen_bounds, | 580 const gfx::Rect& cached_screen_bounds, |
589 const gfx::Rect& current_screen_bounds, | |
590 const gfx::Size& minimum_size, | 581 const gfx::Size& minimum_size, |
591 gfx::Rect* bounds) const { | 582 gfx::Rect* bounds) const { |
592 if (!bounds) | 583 *bounds = cached_bounds; |
593 return; | |
594 | 584 |
595 *bounds = cached_bounds; | 585 gfx::Screen* screen = gfx::Screen::GetNativeScreen(); |
| 586 gfx::Display display = screen->GetDisplayMatching(cached_bounds); |
| 587 gfx::Rect current_screen_bounds = display.work_area(); |
596 | 588 |
597 // Reposition and resize the bounds if the cached_screen_bounds is different | 589 // Reposition and resize the bounds if the cached_screen_bounds is different |
598 // from the current screen bounds and the current screen bounds doesn't | 590 // from the current screen bounds and the current screen bounds doesn't |
599 // completely contain the bounds. | 591 // completely contain the bounds. |
600 if (!cached_screen_bounds.IsEmpty() && | 592 if (cached_screen_bounds != current_screen_bounds && |
601 cached_screen_bounds != current_screen_bounds && | |
602 !current_screen_bounds.Contains(cached_bounds)) { | 593 !current_screen_bounds.Contains(cached_bounds)) { |
603 bounds->set_width( | 594 bounds->set_width( |
604 std::max(minimum_size.width(), | 595 std::max(minimum_size.width(), |
605 std::min(bounds->width(), current_screen_bounds.width()))); | 596 std::min(bounds->width(), current_screen_bounds.width()))); |
606 bounds->set_height( | 597 bounds->set_height( |
607 std::max(minimum_size.height(), | 598 std::max(minimum_size.height(), |
608 std::min(bounds->height(), current_screen_bounds.height()))); | 599 std::min(bounds->height(), current_screen_bounds.height()))); |
609 bounds->set_x( | 600 bounds->set_x( |
610 std::max(current_screen_bounds.x(), | 601 std::max(current_screen_bounds.x(), |
611 std::min(bounds->x(), | 602 std::min(bounds->x(), |
(...skipping 17 matching lines...) Expand all Loading... |
629 region.bounds.x(), | 620 region.bounds.x(), |
630 region.bounds.y(), | 621 region.bounds.y(), |
631 region.bounds.right(), | 622 region.bounds.right(), |
632 region.bounds.bottom(), | 623 region.bounds.bottom(), |
633 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); | 624 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); |
634 } | 625 } |
635 return sk_region; | 626 return sk_region; |
636 } | 627 } |
637 | 628 |
638 } // namespace apps | 629 } // namespace apps |
OLD | NEW |