// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/views/cocoa/native_window_tracker_cocoa.h"
#import <AppKit/AppKit.h>
#include <memory>
@interface BridgedNativeWindowTracker : NSObject
- (instancetype)initWithNSWindow:(NSWindow*)window;
- (bool)wasNSWindowClosed;
- (void)onWindowWillClose:(NSNotification*)notification;
@end
@implementation BridgedNativeWindowTracker {
NSWindow* __weak _window;
}
- (instancetype)initWithNSWindow:(NSWindow*)window {
_window = window;
[NSNotificationCenter.defaultCenter addObserver:self
selector:@selector(onWindowWillClose:)
name:NSWindowWillCloseNotification
object:_window];
return self;
}
- (void)dealloc {
[NSNotificationCenter.defaultCenter removeObserver:self];
}
- (bool)wasNSWindowClosed {
return _window == nil;
}
- (void)onWindowWillClose:(NSNotification*)notification {
[NSNotificationCenter.defaultCenter
removeObserver:self
name:NSWindowWillCloseNotification
object:_window];
_window = nil;
}
@end
namespace views {
struct NativeWindowTrackerCocoa::ObjCStorage {
BridgedNativeWindowTracker* __strong tracker;
};
NativeWindowTrackerCocoa::NativeWindowTrackerCocoa(
gfx::NativeWindow native_window)
: objc_storage_(std::make_unique<ObjCStorage>()) {
objc_storage_->tracker = [[BridgedNativeWindowTracker alloc]
initWithNSWindow:native_window.GetNativeNSWindow()];
}
NativeWindowTrackerCocoa::~NativeWindowTrackerCocoa() = default;
bool NativeWindowTrackerCocoa::WasNativeWindowDestroyed() const {
return [objc_storage_->tracker wasNSWindowClosed];
}
// static
std::unique_ptr<NativeWindowTracker> NativeWindowTracker::Create(
gfx::NativeWindow window) {
return std::make_unique<NativeWindowTrackerCocoa>(window);
}
} // namespace views