| 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 126623ff0e78cda2f2f43166018376a2bf29d2f2..7ab45015421fa5f22f2a00652ad2c215b866b2bc 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 {
|
|
|
| @@ -292,13 +302,39 @@ void NativeWidgetMac::InitModalType(ui::ModalType modal_type) {
|
| }
|
|
|
| gfx::Rect NativeWidgetMac::GetWindowBoundsInScreen() const {
|
| - return gfx::ScreenRectFromNSRect([GetNativeWindow() frame]);
|
| + // -[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 frame_rect = [GetNativeWindow() frame];
|
| + if (bridge_->IsRunMoveLoopActive())
|
| + frame_rect = gfx::ScreenRectToNSRect(WindowServerFrame());
|
| + return gfx::ScreenRectFromNSRect(frame_rect);
|
| +}
|
| +
|
| +gfx::Rect NativeWidgetMac::WindowServerFrame() const {
|
| + CGRect bounds = NSZeroRect;
|
| + CGSGetWindowBounds(_CGSDefaultConnection(), [GetNativeWindow() windowNumber],
|
| + &bounds);
|
| + NSRect rect = ScreenRectToNSRect(gfx::Rect(bounds));
|
| + rect.size = [GetNativeWindow() frame].size;
|
| + return gfx::ScreenRectFromNSRect(rect);
|
| }
|
|
|
| gfx::Rect NativeWidgetMac::GetClientAreaBoundsInScreen() const {
|
| NSWindow* window = GetNativeWindow();
|
| - return gfx::ScreenRectFromNSRect(
|
| - [window contentRectForFrameRect:[window frame]]);
|
| + NSRect frame_rect = [window frame];
|
| + // -[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.
|
| + if (bridge_->IsRunMoveLoopActive())
|
| + frame_rect = gfx::ScreenRectToNSRect(WindowServerFrame());
|
| + return gfx::ScreenRectFromNSRect([window contentRectForFrameRect:frame_rect]);
|
| }
|
|
|
| gfx::Rect NativeWidgetMac::GetRestoredBounds() const {
|
| @@ -546,12 +582,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) {
|
|
|