Chromium Code Reviews| Index: ui/views/widget/native_widget_mac.mm |
| diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm |
| index f307abddba85e17fd28e663327522fdd9d25a34b..31eed6b8b6665790b1346446567d549a93d0af1d 100644 |
| --- a/ui/views/widget/native_widget_mac.mm |
| +++ b/ui/views/widget/native_widget_mac.mm |
| @@ -37,6 +37,16 @@ |
| @end |
| +extern "C" { |
| + |
| +typedef int32_t CGSWindow; |
| +typedef int32_t CGSConnection; |
| +CGSConnection _CGSDefaultConnection(); |
| +OSStatus CGSGetWindowBounds( |
| + CGSConnection connection, CGSWindow window, CGRect* bounds); |
| + |
| +} |
| + |
| namespace views { |
| namespace { |
| @@ -60,6 +70,20 @@ NSInteger StyleMaskForParams(const Widget::InitParams& params) { |
| return NSBorderlessWindowMask; |
| } |
| +// -[NSWindow frame] doesn't update during a window drag. This is not what |
| +// toolkit-views expects, so ask the window server directly. |
| +// |
| +// Note: Moving the window using the window server is asynchronous, and it can |
| +// continue sending the frame updates (using NSWindowMovedEventType event) even |
| +// after the mouse button is released. |
| +NSRect FrameIncludingDrag(NSWindow* window) { |
| + CGRect bounds = NSZeroRect; |
| + CGSGetWindowBounds(_CGSDefaultConnection(), [window windowNumber], &bounds); |
| + const NSRect rect = ScreenRectToNSRect(gfx::Rect(bounds)); |
|
tapted
2016/03/11 09:38:28
perhaps
NSRect rect = ScreenRectToNSRect(gfx::Re
themblsha
2016/04/05 17:20:42
Done. Although the code now lives inside NativeWid
|
| + const NSSize size = [window frame].size; |
| + return NSMakeRect(rect.origin.x, rect.origin.y, size.width, size.height); |
| +} |
| + |
| } // namespace |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -295,8 +319,10 @@ gfx::Rect NativeWidgetMac::GetWindowBoundsInScreen() const { |
| gfx::Rect NativeWidgetMac::GetClientAreaBoundsInScreen() const { |
| NSWindow* window = GetNativeWindow(); |
| - return gfx::ScreenRectFromNSRect( |
| - [window contentRectForFrameRect:[window frame]]); |
| + NSRect frame_rect = [window frame]; |
| + if (bridge_->IsRunMoveLoopActive()) |
| + frame_rect = FrameIncludingDrag(window); |
| + return gfx::ScreenRectFromNSRect([window contentRectForFrameRect:frame_rect]); |
| } |
| gfx::Rect NativeWidgetMac::GetRestoredBounds() const { |
| @@ -548,12 +574,15 @@ Widget::MoveLoopResult NativeWidgetMac::RunMoveLoop( |
| const gfx::Vector2d& drag_offset, |
| Widget::MoveLoopSource source, |
| Widget::MoveLoopEscapeBehavior escape_behavior) { |
| - NOTIMPLEMENTED(); |
| - return Widget::MOVE_LOOP_CANCELED; |
| + if (!bridge_) |
| + return Widget::MOVE_LOOP_CANCELED; |
| + |
| + return bridge_->RunMoveLoop(drag_offset); |
| } |
| void NativeWidgetMac::EndMoveLoop() { |
| - NOTIMPLEMENTED(); |
| + if (bridge_) |
| + bridge_->EndMoveLoop(); |
| } |
| void NativeWidgetMac::SetVisibilityChangedAnimationsEnabled(bool value) { |