| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/views/widget/native_widget_mac.h" | 5 #include "ui/views/widget/native_widget_mac.h" |
| 6 | 6 |
| 7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 @interface ViewsNSWindowCloseAnimator : NSObject<NSAnimationDelegate> { | 30 @interface ViewsNSWindowCloseAnimator : NSObject<NSAnimationDelegate> { |
| 31 @private | 31 @private |
| 32 base::scoped_nsobject<NSWindow> window_; | 32 base::scoped_nsobject<NSWindow> window_; |
| 33 base::scoped_nsobject<NSAnimation> animation_; | 33 base::scoped_nsobject<NSAnimation> animation_; |
| 34 } | 34 } |
| 35 | 35 |
| 36 + (void)closeWindowWithAnimation:(NSWindow*)window; | 36 + (void)closeWindowWithAnimation:(NSWindow*)window; |
| 37 | 37 |
| 38 @end | 38 @end |
| 39 | 39 |
| 40 extern "C" { |
| 41 |
| 42 typedef int32_t CGSWindow; |
| 43 typedef int32_t CGSConnection; |
| 44 CGSConnection _CGSDefaultConnection(); |
| 45 OSStatus CGSGetWindowBounds( |
| 46 CGSConnection connection, CGSWindow window, CGRect* bounds); |
| 47 |
| 48 } |
| 49 |
| 40 namespace views { | 50 namespace views { |
| 41 namespace { | 51 namespace { |
| 42 | 52 |
| 43 NSInteger StyleMaskForParams(const Widget::InitParams& params) { | 53 NSInteger StyleMaskForParams(const Widget::InitParams& params) { |
| 44 // If the Widget is modal, it will be displayed as a sheet. This works best if | 54 // If the Widget is modal, it will be displayed as a sheet. This works best if |
| 45 // it has NSTitledWindowMask. For example, with NSBorderlessWindowMask, the | 55 // it has NSTitledWindowMask. For example, with NSBorderlessWindowMask, the |
| 46 // parent window still accepts input. | 56 // parent window still accepts input. |
| 47 if (params.delegate && | 57 if (params.delegate && |
| 48 params.delegate->GetModalType() == ui::MODAL_TYPE_WINDOW) | 58 params.delegate->GetModalType() == ui::MODAL_TYPE_WINDOW) |
| 49 return NSTitledWindowMask; | 59 return NSTitledWindowMask; |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 if (modal_type == ui::MODAL_TYPE_NONE) | 295 if (modal_type == ui::MODAL_TYPE_NONE) |
| 286 return; | 296 return; |
| 287 | 297 |
| 288 // System modal windows not implemented (or used) on Mac. | 298 // System modal windows not implemented (or used) on Mac. |
| 289 DCHECK_NE(ui::MODAL_TYPE_SYSTEM, modal_type); | 299 DCHECK_NE(ui::MODAL_TYPE_SYSTEM, modal_type); |
| 290 DCHECK(bridge_->parent()); | 300 DCHECK(bridge_->parent()); |
| 291 // Everyhing happens upon show. | 301 // Everyhing happens upon show. |
| 292 } | 302 } |
| 293 | 303 |
| 294 gfx::Rect NativeWidgetMac::GetWindowBoundsInScreen() const { | 304 gfx::Rect NativeWidgetMac::GetWindowBoundsInScreen() const { |
| 295 return gfx::ScreenRectFromNSRect([GetNativeWindow() frame]); | 305 // -[NSWindow frame] doesn't update during a window drag. This is not what |
| 306 // toolkit-views expects, so ask the window server directly. |
| 307 // |
| 308 // Note: Moving the window using the window server is asynchronous, and it can |
| 309 // continue sending the frame updates (using NSWindowMovedEventType event) |
| 310 // even after the mouse button is released. |
| 311 NSRect frame_rect = [GetNativeWindow() frame]; |
| 312 if (bridge_->IsRunMoveLoopActive()) |
| 313 frame_rect = gfx::ScreenRectToNSRect(WindowServerFrame()); |
| 314 return gfx::ScreenRectFromNSRect(frame_rect); |
| 315 } |
| 316 |
| 317 gfx::Rect NativeWidgetMac::WindowServerFrame() const { |
| 318 CGRect bounds = NSZeroRect; |
| 319 CGSGetWindowBounds(_CGSDefaultConnection(), [GetNativeWindow() windowNumber], |
| 320 &bounds); |
| 321 NSRect rect = ScreenRectToNSRect(gfx::Rect(bounds)); |
| 322 rect.size = [GetNativeWindow() frame].size; |
| 323 return gfx::ScreenRectFromNSRect(rect); |
| 296 } | 324 } |
| 297 | 325 |
| 298 gfx::Rect NativeWidgetMac::GetClientAreaBoundsInScreen() const { | 326 gfx::Rect NativeWidgetMac::GetClientAreaBoundsInScreen() const { |
| 299 NSWindow* window = GetNativeWindow(); | 327 NSWindow* window = GetNativeWindow(); |
| 300 return gfx::ScreenRectFromNSRect( | 328 NSRect frame_rect = [window frame]; |
| 301 [window contentRectForFrameRect:[window frame]]); | 329 // -[NSWindow frame] doesn't update during a window drag. This is not what |
| 330 // toolkit-views expects, so ask the window server directly. |
| 331 // |
| 332 // Note: Moving the window using the window server is asynchronous, and it can |
| 333 // continue sending the frame updates (using NSWindowMovedEventType event) |
| 334 // even after the mouse button is released. |
| 335 if (bridge_->IsRunMoveLoopActive()) |
| 336 frame_rect = gfx::ScreenRectToNSRect(WindowServerFrame()); |
| 337 return gfx::ScreenRectFromNSRect([window contentRectForFrameRect:frame_rect]); |
| 302 } | 338 } |
| 303 | 339 |
| 304 gfx::Rect NativeWidgetMac::GetRestoredBounds() const { | 340 gfx::Rect NativeWidgetMac::GetRestoredBounds() const { |
| 305 return bridge_ ? bridge_->GetRestoredBounds() : gfx::Rect(); | 341 return bridge_ ? bridge_->GetRestoredBounds() : gfx::Rect(); |
| 306 } | 342 } |
| 307 | 343 |
| 308 void NativeWidgetMac::SetBounds(const gfx::Rect& bounds) { | 344 void NativeWidgetMac::SetBounds(const gfx::Rect& bounds) { |
| 309 if (bridge_) | 345 if (bridge_) |
| 310 bridge_->SetBounds(bounds); | 346 bridge_->SetBounds(bounds); |
| 311 } | 347 } |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 } | 575 } |
| 540 | 576 |
| 541 gfx::Rect NativeWidgetMac::GetWorkAreaBoundsInScreen() const { | 577 gfx::Rect NativeWidgetMac::GetWorkAreaBoundsInScreen() const { |
| 542 return gfx::ScreenRectFromNSRect([[GetNativeWindow() screen] visibleFrame]); | 578 return gfx::ScreenRectFromNSRect([[GetNativeWindow() screen] visibleFrame]); |
| 543 } | 579 } |
| 544 | 580 |
| 545 Widget::MoveLoopResult NativeWidgetMac::RunMoveLoop( | 581 Widget::MoveLoopResult NativeWidgetMac::RunMoveLoop( |
| 546 const gfx::Vector2d& drag_offset, | 582 const gfx::Vector2d& drag_offset, |
| 547 Widget::MoveLoopSource source, | 583 Widget::MoveLoopSource source, |
| 548 Widget::MoveLoopEscapeBehavior escape_behavior) { | 584 Widget::MoveLoopEscapeBehavior escape_behavior) { |
| 549 NOTIMPLEMENTED(); | 585 if (!bridge_) |
| 550 return Widget::MOVE_LOOP_CANCELED; | 586 return Widget::MOVE_LOOP_CANCELED; |
| 587 |
| 588 return bridge_->RunMoveLoop(drag_offset); |
| 551 } | 589 } |
| 552 | 590 |
| 553 void NativeWidgetMac::EndMoveLoop() { | 591 void NativeWidgetMac::EndMoveLoop() { |
| 554 NOTIMPLEMENTED(); | 592 if (bridge_) |
| 593 bridge_->EndMoveLoop(); |
| 555 } | 594 } |
| 556 | 595 |
| 557 void NativeWidgetMac::SetVisibilityChangedAnimationsEnabled(bool value) { | 596 void NativeWidgetMac::SetVisibilityChangedAnimationsEnabled(bool value) { |
| 558 NOTIMPLEMENTED(); | 597 NOTIMPLEMENTED(); |
| 559 } | 598 } |
| 560 | 599 |
| 561 void NativeWidgetMac::SetVisibilityAnimationDuration( | 600 void NativeWidgetMac::SetVisibilityAnimationDuration( |
| 562 const base::TimeDelta& duration) { | 601 const base::TimeDelta& duration) { |
| 563 NOTIMPLEMENTED(); | 602 NOTIMPLEMENTED(); |
| 564 } | 603 } |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 731 [[ViewsNSWindowCloseAnimator alloc] initWithWindow:window]; | 770 [[ViewsNSWindowCloseAnimator alloc] initWithWindow:window]; |
| 732 } | 771 } |
| 733 | 772 |
| 734 - (void)animationDidEnd:(NSAnimation*)animation { | 773 - (void)animationDidEnd:(NSAnimation*)animation { |
| 735 [window_ close]; | 774 [window_ close]; |
| 736 [animation_ setDelegate:nil]; | 775 [animation_ setDelegate:nil]; |
| 737 [self release]; | 776 [self release]; |
| 738 } | 777 } |
| 739 | 778 |
| 740 @end | 779 @end |
| OLD | NEW |