Index: ash/wm/workspace/workspace_window_resizer.cc |
diff --git a/ash/wm/workspace/workspace_window_resizer.cc b/ash/wm/workspace/workspace_window_resizer.cc |
index fe37687483b5ca361f9d4151ad9938e85c3f0274..ddbe81f6907adad9f015f73a7518ddcb538d0e36 100644 |
--- a/ash/wm/workspace/workspace_window_resizer.cc |
+++ b/ash/wm/workspace/workspace_window_resizer.cc |
@@ -17,7 +17,6 @@ |
#include "ash/wm/workspace/phantom_window_controller.h" |
#include "ash/wm/workspace/snap_sizer.h" |
#include "ui/aura/client/aura_constants.h" |
-#include "ui/aura/env.h" |
#include "ui/aura/root_window.h" |
#include "ui/aura/window.h" |
#include "ui/aura/window_delegate.h" |
@@ -91,6 +90,7 @@ void WorkspaceWindowResizer::Drag(const gfx::Point& location, int event_flags) { |
aura::Window::ConvertPointToTarget(current_root, |
window()->parent(), |
&location_in_parent); |
+ last_mouse_location_ = location_in_parent; |
// Do not use |location| below this point, use |location_in_parent| instead. |
// When the pointer is on |window()->GetRootWindow()|, |location| and |
@@ -147,11 +147,24 @@ void WorkspaceWindowResizer::CompleteDrag(int event_flags) { |
int grid_size = event_flags & ui::EF_CONTROL_DOWN ? |
0 : ash::Shell::GetInstance()->GetGridSize(); |
- if (grid_size <= 1) |
+ gfx::Rect bounds(GetFinalBounds(details_.window->bounds(), grid_size)); |
+ |
+ // Check if the destination is another display. |
+ gfx::Point last_mouse_location_in_screen = last_mouse_location_; |
+ wm::ConvertPointToScreen(window()->parent(), &last_mouse_location_in_screen); |
+ const gfx::Display dst_display = |
+ gfx::Screen::GetDisplayNearestPoint(last_mouse_location_in_screen); |
+ |
+ if (dst_display.id() != |
+ gfx::Screen::GetDisplayNearestWindow(window()->GetRootWindow()).id()) { |
+ // Don't animate when moving to another display. |
+ const gfx::Rect dst_bounds = |
+ ScreenAsh::ConvertRectToScreen(details_.window->parent(), bounds); |
+ details_.window->SetBoundsInScreen(dst_bounds, dst_display); |
return; |
+ } |
- gfx::Rect bounds(GetFinalBounds(details_.window->bounds(), grid_size)); |
- if (bounds == details_.window->bounds()) |
+ if (grid_size <= 1 || bounds == details_.window->bounds()) |
return; |
if (bounds.size() != details_.window->bounds().size()) { |
@@ -159,23 +172,13 @@ void WorkspaceWindowResizer::CompleteDrag(int event_flags) { |
details_.window->SetBounds(bounds); |
return; |
} |
- // TODO(oshima|yusukes): This is temporary solution until better drag & move |
- // is implemented. (crbug.com/136816). |
- gfx::Rect dst_bounds = |
- ScreenAsh::ConvertRectToScreen(details_.window->parent(), bounds); |
- gfx::Display dst_display = gfx::Screen::GetDisplayMatching(dst_bounds); |
- if (dst_display.id() != |
- gfx::Screen::GetDisplayNearestWindow(details_.window).id()) { |
- // Don't animate when moving to another display. |
- details_.window->SetBoundsInScreen(dst_bounds); |
- } else { |
- ui::ScopedLayerAnimationSettings scoped_setter( |
- details_.window->layer()->GetAnimator()); |
- // Use a small duration since the grid is small. |
- scoped_setter.SetTransitionDuration( |
- base::TimeDelta::FromMilliseconds(kSnapDurationMS)); |
- details_.window->SetBounds(bounds); |
- } |
+ |
+ ui::ScopedLayerAnimationSettings scoped_setter( |
+ details_.window->layer()->GetAnimator()); |
+ // Use a small duration since the grid is small. |
+ scoped_setter.SetTransitionDuration( |
+ base::TimeDelta::FromMilliseconds(kSnapDurationMS)); |
+ details_.window->SetBounds(bounds); |
} |
void WorkspaceWindowResizer::RevertDrag() { |