Chromium Code Reviews| 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 #import "ui/views/cocoa/bridged_native_widget.h" | 5 #import "ui/views/cocoa/bridged_native_widget.h" |
| 6 | 6 |
| 7 #import <objc/runtime.h> | 7 #import <objc/runtime.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/mac/mac_util.h" | 10 #include "base/mac/mac_util.h" |
| 11 #import "base/mac/sdk_forward_declarations.h" | 11 #import "base/mac/sdk_forward_declarations.h" |
| 12 #include "base/thread_task_runner_handle.h" | 12 #include "base/thread_task_runner_handle.h" |
| 13 #include "ui/base/hit_test.h" | |
| 13 #include "ui/base/ime/input_method.h" | 14 #include "ui/base/ime/input_method.h" |
| 14 #include "ui/base/ime/input_method_factory.h" | 15 #include "ui/base/ime/input_method_factory.h" |
| 15 #include "ui/base/ui_base_switches_util.h" | 16 #include "ui/base/ui_base_switches_util.h" |
| 16 #include "ui/gfx/display.h" | 17 #include "ui/gfx/display.h" |
| 17 #include "ui/gfx/geometry/dip_util.h" | 18 #include "ui/gfx/geometry/dip_util.h" |
| 18 #import "ui/gfx/mac/coordinate_conversion.h" | 19 #import "ui/gfx/mac/coordinate_conversion.h" |
| 19 #import "ui/gfx/mac/nswindow_frame_controls.h" | 20 #import "ui/gfx/mac/nswindow_frame_controls.h" |
| 20 #include "ui/gfx/screen.h" | 21 #include "ui/gfx/screen.h" |
| 21 #import "ui/views/cocoa/cocoa_mouse_capture.h" | 22 #import "ui/views/cocoa/cocoa_mouse_capture.h" |
| 23 #import "ui/views/cocoa/cocoa_non_client_drag.h" | |
| 22 #import "ui/views/cocoa/bridged_content_view.h" | 24 #import "ui/views/cocoa/bridged_content_view.h" |
| 23 #import "ui/views/cocoa/views_nswindow_delegate.h" | 25 #import "ui/views/cocoa/views_nswindow_delegate.h" |
| 24 #import "ui/views/cocoa/widget_owner_nswindow_adapter.h" | 26 #import "ui/views/cocoa/widget_owner_nswindow_adapter.h" |
| 25 #include "ui/views/widget/native_widget_mac.h" | 27 #include "ui/views/widget/native_widget_mac.h" |
| 26 #include "ui/views/ime/input_method_bridge.h" | 28 #include "ui/views/ime/input_method_bridge.h" |
| 27 #include "ui/views/ime/null_input_method.h" | 29 #include "ui/views/ime/null_input_method.h" |
| 28 #include "ui/views/view.h" | 30 #include "ui/views/view.h" |
| 29 #include "ui/views/views_delegate.h" | 31 #include "ui/views/views_delegate.h" |
| 30 #include "ui/views/widget/widget.h" | 32 #include "ui/views/widget/widget.h" |
| 31 #include "ui/views/widget/widget_aura_utils.h" | 33 #include "ui/views/widget/widget_aura_utils.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 85 NSWindow* window, | 87 NSWindow* window, |
| 86 const gfx::Size& content_size) { | 88 const gfx::Size& content_size) { |
| 87 NSRect content_rect = | 89 NSRect content_rect = |
| 88 NSMakeRect(0, 0, content_size.width(), content_size.height()); | 90 NSMakeRect(0, 0, content_size.width(), content_size.height()); |
| 89 NSRect frame_rect = [window frameRectForContentRect:content_rect]; | 91 NSRect frame_rect = [window frameRectForContentRect:content_rect]; |
| 90 return gfx::Size(NSWidth(frame_rect), NSHeight(frame_rect)); | 92 return gfx::Size(NSWidth(frame_rect), NSHeight(frame_rect)); |
| 91 } | 93 } |
| 92 | 94 |
| 93 BridgedNativeWidget::BridgedNativeWidget(NativeWidgetMac* parent) | 95 BridgedNativeWidget::BridgedNativeWidget(NativeWidgetMac* parent) |
| 94 : native_widget_mac_(parent), | 96 : native_widget_mac_(parent), |
| 97 non_client_drag_(new CocoaNonClientDrag()), | |
|
tapted
2015/05/20 07:18:15
My suggestion: ditch the reference counting and in
jackhou1
2015/05/22 02:49:16
Moved all code to bridged_native_widget.mm.
| |
| 95 focus_manager_(nullptr), | 98 focus_manager_(nullptr), |
| 96 widget_type_(Widget::InitParams::TYPE_WINDOW), // Updated in Init(). | 99 widget_type_(Widget::InitParams::TYPE_WINDOW), // Updated in Init(). |
| 97 parent_(nullptr), | 100 parent_(nullptr), |
| 98 target_fullscreen_state_(false), | 101 target_fullscreen_state_(false), |
| 99 in_fullscreen_transition_(false), | 102 in_fullscreen_transition_(false), |
| 100 window_visible_(false), | 103 window_visible_(false), |
| 101 wants_to_be_visible_(false) { | 104 wants_to_be_visible_(false) { |
| 102 DCHECK(parent); | 105 DCHECK(parent); |
| 103 window_delegate_.reset( | 106 window_delegate_.reset( |
| 104 [[ViewsNSWindowDelegate alloc] initWithBridgedNativeWidget:this]); | 107 [[ViewsNSWindowDelegate alloc] initWithBridgedNativeWidget:this]); |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 515 if (is_key) { | 518 if (is_key) { |
| 516 widget->OnNativeFocus(); | 519 widget->OnNativeFocus(); |
| 517 widget->GetFocusManager()->RestoreFocusedView(); | 520 widget->GetFocusManager()->RestoreFocusedView(); |
| 518 } else { | 521 } else { |
| 519 widget->OnNativeBlur(); | 522 widget->OnNativeBlur(); |
| 520 widget->GetFocusManager()->StoreFocusedView(true); | 523 widget->GetFocusManager()->StoreFocusedView(true); |
| 521 } | 524 } |
| 522 } | 525 } |
| 523 } | 526 } |
| 524 | 527 |
| 528 bool BridgedNativeWidget::OnWindowWillReceiveLeftMouseDown( | |
| 529 NSPoint location_in_window) { | |
| 530 BridgedContentView* content_view = [window_ contentView]; | |
|
tapted
2015/05/20 07:18:15
nit: can just use bridged_view_. I think this will
jackhou1
2015/05/22 02:49:16
Done.
| |
| 531 bool was_draggable = [content_view mouseDownCanMoveWindow]; | |
| 532 gfx::Point point(location_in_window.x, | |
| 533 NSHeight([window_ frame]) - location_in_window.y); | |
|
tapted
2015/05/20 07:18:17
is this the right thing to flip in? Normally Widge
jackhou1
2015/05/22 02:49:16
We want to first flip this to a gfx::Point in the
tapted
2015/05/22 04:03:11
I guess so long as it's not out by the size of the
| |
| 534 bool draggable = native_widget_mac()->GetWidget()->GetNonClientComponent( | |
|
tapted
2015/05/20 07:18:15
nit: maybe draggable -> should_move_window (I thin
jackhou1
2015/05/22 02:49:16
Done.
| |
| 535 point) == HTCAPTION; | |
| 536 LOG(INFO) << "OnWindowWillReceiveLeftMouseDown " << location_in_window.x | |
| 537 << ", " << location_in_window.y << " " << was_draggable << " " | |
| 538 << draggable; | |
| 539 | |
| 540 if (was_draggable) { | |
|
tapted
2015/05/20 07:18:15
nit: move to the top of the function? i.e.
if (!b
jackhou1
2015/05/22 02:49:16
Done.
| |
| 541 // This is a re-post, the movement has already completed, so we can make the | |
|
tapted
2015/05/20 07:18:16
completed -> started?
(i.e. I think we are still
jackhou1
2015/05/22 02:49:16
Done.
| |
| 542 // window non-draggable again. | |
| 543 [content_view setMouseDownCanMoveWindow:NO]; | |
| 544 // AppKit will not update it's cache of mouseDownCanMoveWindow unless | |
| 545 // something changes. | |
|
tapted
2015/05/20 07:18:17
is there a private method we could poke to trigger
jackhou1
2015/05/22 02:49:16
[NSThemeFrame _resetDragMargins] does something bu
| |
| 546 base::scoped_nsobject<NSView> temp_view( | |
| 547 [[NSView alloc] initWithFrame:[content_view bounds]]); | |
| 548 [content_view addSubview:temp_view]; | |
| 549 [temp_view removeFromSuperview]; | |
| 550 return false; | |
| 551 } | |
| 552 | |
| 553 if (draggable) { | |
| 554 // Make the window draggable, then return true to repost the event. | |
| 555 [content_view setMouseDownCanMoveWindow:YES]; | |
| 556 // AppKit will not update it's cache of mouseDownCanMoveWindow unless | |
| 557 // something changes. | |
| 558 base::scoped_nsobject<NSView> temp_view( | |
| 559 [[NSView alloc] initWithFrame:[content_view bounds]]); | |
| 560 [content_view addSubview:temp_view]; | |
| 561 [temp_view removeFromSuperview]; | |
| 562 return true; | |
| 563 } | |
| 564 | |
| 565 return false; | |
| 566 } | |
| 567 | |
| 525 void BridgedNativeWidget::OnSizeConstraintsChanged() { | 568 void BridgedNativeWidget::OnSizeConstraintsChanged() { |
| 526 NSWindow* window = ns_window(); | 569 NSWindow* window = ns_window(); |
| 527 Widget* widget = native_widget_mac()->GetWidget(); | 570 Widget* widget = native_widget_mac()->GetWidget(); |
| 528 gfx::Size min_size = widget->GetMinimumSize(); | 571 gfx::Size min_size = widget->GetMinimumSize(); |
| 529 gfx::Size max_size = widget->GetMaximumSize(); | 572 gfx::Size max_size = widget->GetMaximumSize(); |
| 530 bool is_resizable = widget->widget_delegate()->CanResize(); | 573 bool is_resizable = widget->widget_delegate()->CanResize(); |
| 531 bool shows_resize_controls = | 574 bool shows_resize_controls = |
| 532 is_resizable && (min_size.IsEmpty() || min_size != max_size); | 575 is_resizable && (min_size.IsEmpty() || min_size != max_size); |
| 533 bool shows_fullscreen_controls = | 576 bool shows_fullscreen_controls = |
| 534 is_resizable && widget->widget_delegate()->CanMaximize(); | 577 is_resizable && widget->widget_delegate()->CanMaximize(); |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 849 window_, &kWindowPropertiesKey); | 892 window_, &kWindowPropertiesKey); |
| 850 if (!properties) { | 893 if (!properties) { |
| 851 properties = [NSMutableDictionary dictionary]; | 894 properties = [NSMutableDictionary dictionary]; |
| 852 objc_setAssociatedObject(window_, &kWindowPropertiesKey, | 895 objc_setAssociatedObject(window_, &kWindowPropertiesKey, |
| 853 properties, OBJC_ASSOCIATION_RETAIN); | 896 properties, OBJC_ASSOCIATION_RETAIN); |
| 854 } | 897 } |
| 855 return properties; | 898 return properties; |
| 856 } | 899 } |
| 857 | 900 |
| 858 } // namespace views | 901 } // namespace views |
| OLD | NEW |