Index: ash/wm/window_resizer.cc |
diff --git a/ash/wm/window_resizer.cc b/ash/wm/window_resizer.cc |
index 592fd81cbff8730097ae7b333890b8f334c5cdcf..c759c9162ab84bda43fb1a4c3f6afacfd7e38ac7 100644 |
--- a/ash/wm/window_resizer.cc |
+++ b/ash/wm/window_resizer.cc |
@@ -6,6 +6,8 @@ |
#include "ash/screen_ash.h" |
#include "ash/shell.h" |
+#include "ash/wm/property_util.h" |
+#include "ash/wm/window_util.h" |
#include "ui/aura/client/aura_constants.h" |
#include "ui/aura/root_window.h" |
#include "ui/aura/window.h" |
@@ -112,6 +114,7 @@ WindowResizer::Details::Details(aura::Window* window, |
int window_component) |
: window(window), |
initial_bounds(window->bounds()), |
+ restore_bounds(gfx::Rect()), |
initial_location_in_parent(location), |
initial_opacity(window->layer()->opacity()), |
window_component(window_component), |
@@ -121,6 +124,10 @@ WindowResizer::Details::Details(aura::Window* window, |
size_change_direction( |
GetSizeChangeDirectionForWindowComponent(window_component)), |
is_resizable(bounds_change != kBoundsChangeDirection_None) { |
+ if (wm::IsWindowNormal(window) && |
+ GetRestoreBoundsInScreen(window) && |
+ window_component == HTCAPTION) |
+ restore_bounds = *GetRestoreBoundsInScreen(window); |
} |
WindowResizer::Details::~Details() { |
@@ -175,6 +182,17 @@ gfx::Rect WindowResizer::CalculateBoundsForDrag( |
gfx::Size size = GetSizeForDrag(details, &delta_x, &delta_y); |
gfx::Point origin = GetOriginForDrag(details, delta_x, delta_y); |
+ // When we might want to reposition a window which is also restored to its |
+ // previous size, to keep the cursor within the dragged window. |
+ if (!details.restore_bounds.IsEmpty() && |
+ details.bounds_change & kBoundsChange_Repositions) { |
+ // However - it is not desirable to change the origin if the window would |
+ // be still hit by the cursor. |
+ if (details.initial_location_in_parent.x() > |
+ details.initial_bounds.x() + details.restore_bounds.width()) |
+ origin.set_x(location.x() - details.restore_bounds.width() / 2); |
+ } |
+ |
gfx::Rect new_bounds(origin, size); |
// Update bottom edge to stay in the work area when we are resizing |
// by dragging the bottome edge or corners. |
@@ -229,6 +247,8 @@ gfx::Size WindowResizer::GetSizeForDrag(const Details& details, |
gfx::Size min_size = details.window->delegate()->GetMinimumSize(); |
size.SetSize(GetWidthForDrag(details, min_size.width(), delta_x), |
GetHeightForDrag(details, min_size.height(), delta_y)); |
+ } else if (!details.restore_bounds.IsEmpty()) { |
+ size = details.restore_bounds.size(); |
} |
return size; |
} |