如何检查当前空间是Dashboard?

时间:2012-06-15 11:10:10

标签: cocoa space dashboard nsworkspace

示例代码是

    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(activeSpaceDidChange:) name:NSWorkspaceActiveSpaceDidChangeNotification object:nil];

然后

- (void) activeSpaceDidChange:(NSNotification *)aNotification {
         // code to check if current workspace is dashboard?
}

我想检查当前空间是否为仪表板?有什么想法吗?

1 个答案:

答案 0 :(得分:4)

首先想到的是根据这个答案获得当前的空间ID:Detecting when a space changes in Spaces in Mac OS X。这里的问题是在OSX 10.8中不推荐使用密钥kCGWindowWorkspace。所以没有直接的方法来获取这些信息。

在我的解决方案中,我现在检查不同的窗口或所有者,它们只是仪表板空间中的一个或所有其他空间:

  • 如果有一个kCGWindowName.wdgt/结尾的窗口
  • ,则用户位于信息中心
  • 如果有一个显示kCGWindowName == System Status Item ClonekCGWindowOwnerName == SystemUIServer | Finder
  • 的窗口,则用户在信息中心上

那么为什么我不只是使用.wdgt/支票? - 因为如果仪表板上现在有小部件,则无效

那么为什么我要使用多个窗口检查? - 。因为我不确定哪个窗口始终在所有空间。至少System Status Item CloneFinder并不总是存在。

这里我的实现是将此函数作为类别添加到NSWorkspace

- (BOOL) userIsOnDashboardSpace {

NSArray*  windowsInSpace = (__bridge NSArray *) CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListOptionOnScreenOnly, kCGNullWindowID);

NSUInteger indexOfWidget = [windowsInSpace indexOfObjectPassingTest:^BOOL(NSDictionary* obj, NSUInteger idx, BOOL *stop) {

    if ([obj objectForKey:(id)kCGWindowName]) {
        NSString *name = (NSString *)[obj objectForKey:(id)kCGWindowName];
        if ([name isEqualToString:@"System Status Item Clone"]) {
            *stop = true;
            return false;
        }            
        if ([name hasSuffix:@".wdgt/"]) {
            *stop = true;
            return true;
        }
    }        
    if ([obj objectForKey:(id)kCGWindowOwnerName]) {
        NSString *name = (NSString *)[obj objectForKey:(id)kCGWindowOwnerName];
        if ([name isEqualToString:@"SystemUIServer"]) {
            *stop = true;
            return false;
        }            
        if ([name isEqualToString:@"Finder"]) {
            *stop = true;
            return false;
        }       
    }

    return false;
}];    
return indexOfWidget != NSNotFound;

}