| 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 #ifndef UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_H_ | 5 #ifndef UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_H_ |
| 6 #define UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_H_ | 6 #define UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_H_ |
| 7 | 7 |
| 8 #import <Cocoa/Cocoa.h> | 8 #import <Cocoa/Cocoa.h> |
| 9 | 9 |
| 10 #import "base/mac/scoped_nsobject.h" | 10 #import "base/mac/scoped_nsobject.h" |
| 11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 12 #include "ui/compositor/layer_owner.h" |
| 12 #import "ui/views/focus/focus_manager.h" | 13 #import "ui/views/focus/focus_manager.h" |
| 13 #include "ui/views/ime/input_method_delegate.h" | 14 #include "ui/views/ime/input_method_delegate.h" |
| 14 #include "ui/views/views_export.h" | 15 #include "ui/views/views_export.h" |
| 15 #include "ui/views/widget/widget.h" | 16 #include "ui/views/widget/widget.h" |
| 16 | 17 |
| 18 #import "content/browser/compositor/browser_compositor_view_mac.h" |
| 19 |
| 17 @class BridgedContentView; | 20 @class BridgedContentView; |
| 18 @class ViewsNSWindowDelegate; | 21 @class ViewsNSWindowDelegate; |
| 19 | 22 |
| 20 namespace ui { | 23 namespace ui { |
| 21 class InputMethod; | 24 class InputMethod; |
| 22 } | 25 } |
| 23 | 26 |
| 24 namespace views { | 27 namespace views { |
| 25 | 28 |
| 26 class InputMethod; | 29 class InputMethod; |
| 27 class NativeWidgetMac; | 30 class NativeWidgetMac; |
| 28 class View; | 31 class View; |
| 29 | 32 |
| 30 // A bridge to an NSWindow managed by an instance of NativeWidgetMac or | 33 // A bridge to an NSWindow managed by an instance of NativeWidgetMac or |
| 31 // DesktopNativeWidgetMac. Serves as a helper class to bridge requests from the | 34 // DesktopNativeWidgetMac. Serves as a helper class to bridge requests from the |
| 32 // NativeWidgetMac to the Cocoa window. Behaves a bit like an aura::Window. | 35 // NativeWidgetMac to the Cocoa window. Behaves a bit like an aura::Window. |
| 33 class VIEWS_EXPORT BridgedNativeWidget : public internal::InputMethodDelegate, | 36 class VIEWS_EXPORT BridgedNativeWidget |
| 34 public FocusChangeListener { | 37 : public ui::LayerDelegate, |
| 38 public ui::LayerOwner, |
| 39 public internal::InputMethodDelegate, |
| 40 public FocusChangeListener, |
| 41 public content::BrowserCompositorViewMacClient { |
| 35 public: | 42 public: |
| 36 // Creates one side of the bridge. |parent| must not be NULL. | 43 // Creates one side of the bridge. |parent| must not be NULL. |
| 37 explicit BridgedNativeWidget(NativeWidgetMac* parent); | 44 explicit BridgedNativeWidget(NativeWidgetMac* parent); |
| 38 virtual ~BridgedNativeWidget(); | 45 virtual ~BridgedNativeWidget(); |
| 39 | 46 |
| 40 // Initialize the bridge, "retains" ownership of |window|. | 47 // Initialize the bridge, "retains" ownership of |window|. |
| 41 void Init(base::scoped_nsobject<NSWindow> window, | 48 void Init(base::scoped_nsobject<NSWindow> window, |
| 42 const Widget::InitParams& params); | 49 const Widget::InitParams& params); |
| 43 | 50 |
| 44 // Sets or clears the focus manager to use for tracking focused views. | 51 // Sets or clears the focus manager to use for tracking focused views. |
| 45 // This does NOT take ownership of |focus_manager|. | 52 // This does NOT take ownership of |focus_manager|. |
| 46 void SetFocusManager(FocusManager* focus_manager); | 53 void SetFocusManager(FocusManager* focus_manager); |
| 47 | 54 |
| 55 // Changes the bounds of the window and the hosted layer if present. |
| 56 void SetBounds(const gfx::Rect& new_bounds); |
| 57 |
| 48 // Set or clears the views::View bridged by the content view. This does NOT | 58 // Set or clears the views::View bridged by the content view. This does NOT |
| 49 // take ownership of |view|. | 59 // take ownership of |view|. |
| 50 void SetRootView(views::View* view); | 60 void SetRootView(views::View* view); |
| 51 | 61 |
| 52 // Called internally by the NSWindowDelegate when the window is closing. | 62 // Called internally by the NSWindowDelegate when the window is closing. |
| 53 void OnWindowWillClose(); | 63 void OnWindowWillClose(); |
| 54 | 64 |
| 55 // Called by the NSWindowDelegate when a fullscreen operation begins. If | 65 // Called by the NSWindowDelegate when a fullscreen operation begins. If |
| 56 // |target_fullscreen_state| is true, the target state is fullscreen. | 66 // |target_fullscreen_state| is true, the target state is fullscreen. |
| 57 // Otherwise, a transition has begun to come out of fullscreen. | 67 // Otherwise, a transition has begun to come out of fullscreen. |
| 58 void OnFullscreenTransitionStart(bool target_fullscreen_state); | 68 void OnFullscreenTransitionStart(bool target_fullscreen_state); |
| 59 | 69 |
| 60 // Called when a fullscreen transition completes. If target_fullscreen_state() | 70 // Called when a fullscreen transition completes. If target_fullscreen_state() |
| 61 // does not match |actual_fullscreen_state|, a new transition will begin. | 71 // does not match |actual_fullscreen_state|, a new transition will begin. |
| 62 void OnFullscreenTransitionComplete(bool actual_fullscreen_state); | 72 void OnFullscreenTransitionComplete(bool actual_fullscreen_state); |
| 63 | 73 |
| 64 // Transition the window into or out of fullscreen. This will immediately | 74 // Transition the window into or out of fullscreen. This will immediately |
| 65 // invert the value of target_fullscreen_state(). | 75 // invert the value of target_fullscreen_state(). |
| 66 void ToggleDesiredFullscreenState(); | 76 void ToggleDesiredFullscreenState(); |
| 67 | 77 |
| 78 // Called by the NSWindowDelegate when the size of the window changes. |
| 79 void OnSizeChanged(); |
| 80 |
| 81 // Called by the NSWindowDelegate when the visibility of the window may have |
| 82 // changed. For example, due to a (de)miniaturize operation, or the window |
| 83 // being reordered in (or out of) the screen list. |
| 84 void OnVisibilityChanged(); |
| 85 |
| 86 // Called by the NSWindowDelegate when the window moves to a new display or |
| 87 // when the display properties (backing store scale factor or colorspace |
| 88 // changes. |
| 89 void OnDisplayChanged(); |
| 90 |
| 68 // See widget.h for documentation. | 91 // See widget.h for documentation. |
| 69 InputMethod* CreateInputMethod(); | 92 InputMethod* CreateInputMethod(); |
| 70 ui::InputMethod* GetHostInputMethod(); | 93 ui::InputMethod* GetHostInputMethod(); |
| 71 | 94 |
| 72 // The restored bounds will be derived from the current NSWindow frame unless | 95 // The restored bounds will be derived from the current NSWindow frame unless |
| 73 // fullscreen or transitioning between fullscreen states. | 96 // fullscreen or transitioning between fullscreen states. |
| 74 gfx::Rect GetRestoredBounds() const; | 97 gfx::Rect GetRestoredBounds() const; |
| 75 | 98 |
| 99 ui::Layer* GetOrCreateLayer(); |
| 100 |
| 76 NativeWidgetMac* native_widget_mac() { return native_widget_mac_; } | 101 NativeWidgetMac* native_widget_mac() { return native_widget_mac_; } |
| 77 BridgedContentView* ns_view() { return bridged_view_; } | 102 BridgedContentView* ns_view() { return bridged_view_; } |
| 78 NSWindow* ns_window() { return window_; } | 103 NSWindow* ns_window() { return window_; } |
| 79 | 104 |
| 80 bool target_fullscreen_state() const { return target_fullscreen_state_; } | 105 bool target_fullscreen_state() const { return target_fullscreen_state_; } |
| 81 | 106 |
| 82 // Overridden from internal::InputMethodDelegate: | 107 // Overridden from internal::InputMethodDelegate: |
| 83 virtual void DispatchKeyEventPostIME(const ui::KeyEvent& key) override; | 108 virtual void DispatchKeyEventPostIME(const ui::KeyEvent& key) override; |
| 84 | 109 |
| 110 // Overridden from content::BrowserCompositorViewMacClient: |
| 111 virtual bool BrowserCompositorViewShouldAckImmediately() const OVERRIDE; |
| 112 virtual void BrowserCompositorViewFrameSwapped( |
| 113 const std::vector<ui::LatencyInfo>& latency_info) OVERRIDE; |
| 114 virtual NSView* BrowserCompositorSuperview() OVERRIDE; |
| 115 virtual ui::Layer* BrowserCompositorRootLayer() OVERRIDE; |
| 116 |
| 85 private: | 117 private: |
| 86 // Closes all child windows. BridgedNativeWidget children will be destroyed. | 118 // Closes all child windows. BridgedNativeWidget children will be destroyed. |
| 87 void RemoveOrDestroyChildren(); | 119 void RemoveOrDestroyChildren(); |
| 88 | 120 |
| 121 // Size the layer, taking into account display scale factor. |
| 122 void SetLayerSize(const gfx::Size& size_in_dip); |
| 123 |
| 124 void OnWindowBoundsChanged(); |
| 125 |
| 126 // Overridden from ui::LayerDelegate: |
| 127 virtual void OnPaintLayer(gfx::Canvas* canvas) OVERRIDE; |
| 128 virtual void OnDelegatedFrameDamage( |
| 129 const gfx::Rect& damage_rect_in_dip) OVERRIDE; |
| 130 virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE; |
| 131 virtual base::Closure PrepareForLayerBoundsChange() OVERRIDE; |
| 132 |
| 89 views::NativeWidgetMac* native_widget_mac_; // Weak. Owns this. | 133 views::NativeWidgetMac* native_widget_mac_; // Weak. Owns this. |
| 90 base::scoped_nsobject<NSWindow> window_; | 134 base::scoped_nsobject<NSWindow> window_; |
| 91 base::scoped_nsobject<ViewsNSWindowDelegate> window_delegate_; | 135 base::scoped_nsobject<ViewsNSWindowDelegate> window_delegate_; |
| 92 base::scoped_nsobject<BridgedContentView> bridged_view_; | 136 base::scoped_nsobject<BridgedContentView> bridged_view_; |
| 93 scoped_ptr<ui::InputMethod> input_method_; | 137 scoped_ptr<ui::InputMethod> input_method_; |
| 94 FocusManager* focus_manager_; // Weak. Owned by our Widget. | 138 FocusManager* focus_manager_; // Weak. Owned by our Widget. |
| 95 | 139 |
| 140 base::scoped_nsobject<NSView> compositor_superview_; |
| 141 scoped_ptr<content::BrowserCompositorViewMac> compositor_view_; |
| 142 content::BrowserCompositorViewPlaceholderMac recycling_keepalive_; |
| 143 |
| 96 // Tracks the bounds when the window last started entering fullscreen. Used to | 144 // Tracks the bounds when the window last started entering fullscreen. Used to |
| 97 // provide an answer for GetRestoredBounds(), but not ever sent to Cocoa (it | 145 // provide an answer for GetRestoredBounds(), but not ever sent to Cocoa (it |
| 98 // has its own copy, but doesn't provide access to it). | 146 // has its own copy, but doesn't provide access to it). |
| 99 gfx::Rect bounds_before_fullscreen_; | 147 gfx::Rect bounds_before_fullscreen_; |
| 100 | 148 |
| 101 // Whether this window wants to be fullscreen. If a fullscreen animation is in | 149 // Whether this window wants to be fullscreen. If a fullscreen animation is in |
| 102 // progress then it might not be actually fullscreen. | 150 // progress then it might not be actually fullscreen. |
| 103 bool target_fullscreen_state_; | 151 bool target_fullscreen_state_; |
| 104 | 152 |
| 105 // Whether this window is in a fullscreen transition, and the fullscreen state | 153 // Whether this window is in a fullscreen transition, and the fullscreen state |
| 106 // can not currently be changed. | 154 // can not currently be changed. |
| 107 bool in_fullscreen_transition_; | 155 bool in_fullscreen_transition_; |
| 108 | 156 |
| 157 // Stores the value last read from -[NSWindow isVisible], to detect visibility |
| 158 // changes. |
| 159 bool window_visible_; |
| 160 |
| 109 // Overridden from FocusChangeListener: | 161 // Overridden from FocusChangeListener: |
| 110 virtual void OnWillChangeFocus(View* focused_before, | 162 virtual void OnWillChangeFocus(View* focused_before, |
| 111 View* focused_now) override; | 163 View* focused_now) override; |
| 112 virtual void OnDidChangeFocus(View* focused_before, | 164 virtual void OnDidChangeFocus(View* focused_before, |
| 113 View* focused_now) override; | 165 View* focused_now) override; |
| 114 | 166 |
| 115 DISALLOW_COPY_AND_ASSIGN(BridgedNativeWidget); | 167 DISALLOW_COPY_AND_ASSIGN(BridgedNativeWidget); |
| 116 }; | 168 }; |
| 117 | 169 |
| 118 } // namespace views | 170 } // namespace views |
| 119 | 171 |
| 120 #endif // UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_H_ | 172 #endif // UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_H_ |
| OLD | NEW |