Index: ui/views/cocoa/bridged_native_widget.mm |
diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm |
index 560f533009df6cd8efb4132130a2ed2640e7074a..91d4ff642d656e65f71afe42a652113c3a5fb6cb 100644 |
--- a/ui/views/cocoa/bridged_native_widget.mm |
+++ b/ui/views/cocoa/bridged_native_widget.mm |
@@ -25,7 +25,8 @@ BridgedNativeWidget::BridgedNativeWidget(NativeWidgetMac* parent) |
: native_widget_mac_(parent), |
focus_manager_(NULL), |
target_fullscreen_state_(false), |
- in_fullscreen_transition_(false) { |
+ in_fullscreen_transition_(false), |
+ window_visible_(false) { |
DCHECK(parent); |
window_delegate_.reset( |
[[ViewsNSWindowDelegate alloc] initWithBridgedNativeWidget:this]); |
@@ -50,6 +51,18 @@ void BridgedNativeWidget::Init(base::scoped_nsobject<NSWindow> window, |
window_.swap(window); |
[window_ setDelegate:window_delegate_]; |
+ // Register for application hide notifications so that visibility can be |
+ // properly tracked. This is not done in the delegate so that the lifetime is |
+ // tied to the C++ object, rather than the delegate (which may be reference |
+ // counted). This is required since the application hides do not send an |
+ // orderOut: to individual windows. Unhide, however, does send an order |
+ // message. |
+ [[NSNotificationCenter defaultCenter] |
+ addObserver:window_delegate_ |
+ selector:@selector(onWindowOrderChanged:) |
+ name:NSApplicationDidHideNotification |
+ object:nil]; |
+ |
// Validate the window's initial state, otherwise the bridge's initial |
// tracking state will be incorrect. |
DCHECK(![window_ isVisible]); |
@@ -97,6 +110,7 @@ void BridgedNativeWidget::SetRootView(views::View* view) { |
void BridgedNativeWidget::OnWindowWillClose() { |
[[window_ parentWindow] removeChildWindow:window_]; |
[window_ setDelegate:nil]; |
+ [[NSNotificationCenter defaultCenter] removeObserver:window_delegate_]; |
native_widget_mac_->OnWindowWillClose(); |
} |
@@ -155,6 +169,15 @@ void BridgedNativeWidget::ToggleDesiredFullscreenState() { |
[window_ setCollectionBehavior:behavior]; |
} |
+void BridgedNativeWidget::OnVisibilityChanged() { |
+ if (window_visible_ == [window_ isVisible]) |
+ return; |
+ |
+ window_visible_ = [window_ isVisible]; |
+ native_widget_mac_->GetWidget()->OnNativeWidgetVisibilityChanged( |
+ window_visible_); |
+} |
+ |
InputMethod* BridgedNativeWidget::CreateInputMethod() { |
if (switches::IsTextInputFocusManagerEnabled()) |
return new NullInputMethod(); |