- (instancetype)initWithWidgetSpaceTracker:(WidgetSpaceTracker*)owner {
if ((self = [super init])) {
DCHECK(owner);
_owner = owner;
NSWindow* window = _owner->GetNSWindow();
if (window) {
[window addObserver:self
forKeyPath:@"onActiveSpace"
options:NSKeyValueObservingOptionNew
context:nil];
}
}
return self;
}
- (void)observeValueForKeyPath:(NSString*)keyPath
ofObject:(id)object
change:(NSDictionary<NSKeyValueChangeKey, id>*)change
context:(void*)context {
DCHECK(_owner);
if ([keyPath isEqual:@"onActiveSpace"]) {
_owner->OnSpaceActiveChanged([change[NSKeyValueChangeNewKey] boolValue]);
} else {
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
}
onActiveSpace
属性,因为天窗不支持该功能。如果您真的想观察到它,则可以观察到名为
_NSWindowDidChangeWindowNumber
-[NSWindow _commonAwake]
属性表明NSWINDOW创建了一个NSCGSwindow,并且已连接到Windowserver的空间。如果它是一个选项卡窗口,并且未选择该选项卡,则将返回否。你为什么要观察这个?如果您用
onActiveSpace
初始化Nswindow,则NSWINDOW将立即在空间上。如果您想确定用户是否可见窗口,则需要使用
defer:YES
并观察
occlusionState
。