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..b235ca50321acb408f2fb2a6c5abf501401c2388 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. |
| +NSRect FrameIncludingDrag(NSWindow* window) { |
| + CGRect bounds = NSZeroRect; |
| + CGSGetWindowBounds(_CGSDefaultConnection(), [window windowNumber], &bounds); |
| + NSRect rect = ScreenRectToNSRect(gfx::Rect(bounds)); |
| + |
| + // If no mouse buttons are down, there is no drag. So it should match the |
| + // window frame. |
| + //DCHECK([NSEvent pressedMouseButtons] == 0 || |
|
tapted
2016/03/10 11:51:19
This DCHECK would actually fail, which surprised m
themblsha
2016/03/10 17:18:58
Done.
|
| + // NSEqualRects(rect, [window frame])); |
| + return rect; |
| +} |
| + |
| } // namespace |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -201,8 +225,8 @@ void NativeWidgetMac::ViewRemoved(View* view) { |
| // TODO(tapted): Something for drag and drop might be needed here in future. |
| // See http://crbug.com/464581. A NOTIMPLEMENTED() here makes a lot of spam, |
| // so only emit it when a drag and drop could be likely. |
| - if (IsMouseButtonDown()) |
| - NOTIMPLEMENTED(); |
| + // if (IsMouseButtonDown()) |
|
tapted
2016/03/10 11:51:19
nit: uncomment (sorry for the log spam - drag and
themblsha
2016/03/10 17:18:58
Done.
|
| + // NOTIMPLEMENTED(); |
| } |
| void NativeWidgetMac::SetNativeWindowProperty(const char* name, void* value) { |
| @@ -296,7 +320,7 @@ gfx::Rect NativeWidgetMac::GetWindowBoundsInScreen() const { |
| gfx::Rect NativeWidgetMac::GetClientAreaBoundsInScreen() const { |
| NSWindow* window = GetNativeWindow(); |
| return gfx::ScreenRectFromNSRect( |
| - [window contentRectForFrameRect:[window frame]]); |
| + [window contentRectForFrameRect:FrameIncludingDrag(window)]); |
| } |
| gfx::Rect NativeWidgetMac::GetRestoredBounds() const { |
| @@ -548,12 +572,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) { |