Index: ash/wm/workspace/snap_sizer.cc |
diff --git a/ash/wm/workspace/snap_sizer.cc b/ash/wm/workspace/snap_sizer.cc |
index 11b59470fcd87d5be27e934cc992feac57b7c90a..6403740ceb372b71bfaf411d89f0e0d9a697a62d 100644 |
--- a/ash/wm/workspace/snap_sizer.cc |
+++ b/ash/wm/workspace/snap_sizer.cc |
@@ -11,6 +11,7 @@ |
#include "ash/wm/window_resizer.h" |
#include "ash/wm/window_util.h" |
#include "ui/aura/window.h" |
+#include "ui/aura/window_delegate.h" |
#include "ui/gfx/screen.h" |
namespace ash { |
@@ -18,7 +19,7 @@ namespace internal { |
namespace { |
-// A list of ideal window width in pixel which will be used to populate the |
+// A list of ideal window widths in DIP which will be used to populate the |
// |usable_width_| list. |
const int kIdealWidth[] = { 1280, 1024, 768, 640 }; |
@@ -33,33 +34,74 @@ const int kDelayBeforeIncreaseMS = 500; |
const int kMovesBeforeAdjust = 25; |
const int kPixelsBeforeAdjust = 100; |
-// When the smallest resolution does not fit on the screen, we take this |
-// fraction of the available space. |
-const int kMinimumScreenPercent = 90; |
+// The maximum fraction of the screen width that a snapped window is allowed |
+// to take up. |
+const int kMaximumScreenPercent = 90; |
-// Create the list of possible width for the current screen configuration: |
+// The width that a window should be snapped to if resizing is disabled in the |
+// SnapSizer for devices with small screen resolutions. |
+const int kDefaultWidthSmallScreen = 1024; |
+ |
+// Returns the minimum width that |window| can be snapped to. The returned width |
+// may not be in the width list generated by BuildIdealWidthList(). |
+int GetMinWidth(aura::Window* window) { |
+ return window->delegate() ? window->delegate()->GetMinimumSize().width() : 0; |
+} |
+ |
+// Returns the maximum width that |window| can be snapped to. The returned width |
+// may not be in the width list generated by BuildIdealWidthList(). |
+// The aura::WindowDelegate's max size is ignored because |
+// ash::wm::CanSnapWindow() returns false when a max size is specified. |
+int GetMaxWidth(aura::Window* window) { |
+ gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent(window)); |
+ return std::max(work_area.width() * kMaximumScreenPercent / 100, |
+ GetMinWidth(window)); |
+} |
+ |
+// Returns the width that |window| should be snapped to if resizing is disabled |
+// in the SnapSizer. |
+int GetDefaultWidth(aura::Window* window) { |
+ gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent(window)); |
+ int width = std::max(kDefaultWidthSmallScreen, work_area.width() / 2); |
+ |
+ width = std::min(width, GetMaxWidth(window)); |
+ return std::max(width, GetMinWidth(window)); |
+} |
+ |
+// Create the list of possible widths for the current screen configuration: |
// Fill the |usable_width_| list with items from |kIdealWidth| which fit on |
// the screen and supplement it with the 'half of screen' size. Furthermore, |
-// add an entry for 90% of the screen size if it is smaller then the biggest |
+// add an entry for 90% of the screen size if it is smaller than the biggest |
// value in the |kIdealWidth| list (to get a step between the values). |
std::vector<int> BuildIdealWidthList(aura::Window* window) { |
- std::vector<int> ideal_width_list; |
+ int minimum_width = GetMinWidth(window); |
+ int maximum_width = GetMaxWidth(window); |
+ |
gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent(window)); |
- int half_size = work_area.width() / 2; |
- int maximum_width = (kMinimumScreenPercent * work_area.width()) / 100; |
+ int half_width = work_area.width() / 2; |
+ if (half_width < minimum_width || half_width > maximum_width) |
+ half_width = 0; |
+ |
+ std::vector<int> ideal_width_list; |
for (size_t i = 0; i < arraysize(kIdealWidth); i++) { |
- if (maximum_width >= kIdealWidth[i]) { |
+ if (kIdealWidth[i] >= minimum_width && kIdealWidth[i] <= maximum_width) { |
if (i && !ideal_width_list.size() && maximum_width != kIdealWidth[i]) |
ideal_width_list.push_back(maximum_width); |
- if (half_size > kIdealWidth[i]) |
- ideal_width_list.push_back(half_size); |
- if (half_size >= kIdealWidth[i]) |
- half_size = 0; |
+ if (half_width > kIdealWidth[i]) |
+ ideal_width_list.push_back(half_width); |
+ if (half_width >= kIdealWidth[i]) |
+ half_width = 0; |
ideal_width_list.push_back(kIdealWidth[i]); |
} |
} |
- if (half_size) |
- ideal_width_list.push_back(half_size); |
+ if (half_width) |
+ ideal_width_list.push_back(half_width); |
+ if (ideal_width_list.empty()) { |
+ if (minimum_width > 0) |
+ ideal_width_list.push_back(minimum_width); |
+ else |
+ ideal_width_list.push_back(maximum_width); |
+ } |
return ideal_width_list; |
} |
@@ -163,15 +205,10 @@ void SnapSizer::SelectDefaultSizeAndDisableResize() { |
gfx::Rect SnapSizer::GetTargetBoundsForSize(size_t size_index) const { |
gfx::Rect work_area(ScreenAsh::GetDisplayWorkAreaBoundsInParent(window_)); |
int y = work_area.y(); |
- // We don't align to the bottom of the grid as the launcher may not |
- // necessarily align to the grid (happens when auto-hidden). |
int max_y = work_area.bottom(); |
int width = 0; |
if (resize_disabled_) { |
- // Make sure that we keep the size of the window smaller then a certain |
- // fraction of the screen space. |
- int minimum_size = (kMinimumScreenPercent * work_area.width()) / 100; |
- width = std::max(std::min(minimum_size, 1024), work_area.width() / 2); |
+ width = GetDefaultWidth(window_); |
} else { |
DCHECK(size_index < usable_width_.size()); |
width = usable_width_[size_index]; |