Index: ui/views/cocoa/bridged_native_widget.mm |
diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm |
index 987b3130b06a7473c606d55d42c98528f183b814..47373d0d4a973470d3ddc37c590af7672d842173 100644 |
--- a/ui/views/cocoa/bridged_native_widget.mm |
+++ b/ui/views/cocoa/bridged_native_widget.mm |
@@ -26,6 +26,7 @@ |
#import "ui/views/cocoa/bridged_content_view.h" |
#import "ui/views/cocoa/drag_drop_client_mac.h" |
#import "ui/views/cocoa/cocoa_mouse_capture.h" |
+#import "ui/views/cocoa/cocoa_window_move_loop.h" |
#include "ui/views/cocoa/tooltip_manager_mac.h" |
#import "ui/views/cocoa/views_nswindow_delegate.h" |
#import "ui/views/cocoa/widget_owner_nswindow_adapter.h" |
@@ -619,6 +620,39 @@ bool BridgedNativeWidget::HasCapture() { |
return mouse_capture_ && mouse_capture_->IsActive(); |
} |
+Widget::MoveLoopResult BridgedNativeWidget::RunMoveLoop( |
+ const gfx::Vector2d& drag_offset) { |
+ DCHECK(!HasCapture()); |
+ DCHECK(!window_move_loop_); |
+ |
+ // RunMoveLoop caller is responsible for updating the window to be under the |
+ // mouse, but it does this using possibly outdated coordinate from the mouse |
+ // event, and mouse is very likely moved beyound that point. |
+ |
+ // Compensate for mouse drift by shifting the initial mouse position we pass |
+ // to CocoaWindowMoveLoop, so as it handles incoming move events the window's |
+ // top left corner will be |drag_offset| from the current mouse position. |
+ |
+ const gfx::Rect frame = gfx::ScreenRectFromNSRect([window_ frame]); |
+ const gfx::Point mouse_in_screen(frame.x() + drag_offset.x(), |
+ frame.y() + drag_offset.y()); |
+ window_move_loop_.reset(new CocoaWindowMoveLoop( |
+ this, gfx::ScreenPointToNSPoint(mouse_in_screen))); |
+ |
+ return window_move_loop_->Run(); |
+ |
+ // |this| may be destroyed during the RunLoop, causing it to exit early. |
+ // Even if that doesn't happen, CocoaWindowMoveLoop will clean itself up by |
+ // calling EndMoveLoop(). So window_move_loop_ will always be null before the |
+ // function returns. But don't DCHECK since |this| might not be valid. |
+} |
+ |
+void BridgedNativeWidget::EndMoveLoop() { |
+ DCHECK(window_move_loop_); |
+ window_move_loop_->End(); |
+ window_move_loop_.reset(); |
+} |
+ |
void BridgedNativeWidget::SetNativeWindowProperty(const char* name, |
void* value) { |
NSString* key = [NSString stringWithUTF8String:name]; |
@@ -737,6 +771,10 @@ void BridgedNativeWidget::OnSizeChanged() { |
[bridged_view_ updateWindowMask]; |
} |
+void BridgedNativeWidget::OnPositionChanged() { |
+ native_widget_mac_->GetWidget()->OnNativeWidgetMove(); |
+} |
+ |
void BridgedNativeWidget::OnVisibilityChanged() { |
OnVisibilityChangedTo([window_ isVisible]); |
} |