Первое, что я пробовал, - это получить идентификатор текущего места в соответствии с этим ответом: Detecting when a space changes in Spaces in Mac OS X. Проблема здесь в том, что ключ kCGWindowWorkspace
устарел в OSX 10.8. Таким образом, нет прямого способа получить эту информацию.
В моем решении теперь я проверить для различных окон или владельцев, которые только одна приборная панель пространство или на всех других пространствах:
- Пользователь находится на приборной панели, если есть одно окно, которое
kCGWindowName
заканчивается .wdgt/
- пользователь является не на приборной панели, если есть одно окно с
kCGWindowName == System Status Item Clone
, kCGWindowOwnerName == SystemUIServer | Finder
Так почему я не просто использую проверку .wdgt/
? - Потому что, если на панели теперь есть виджет, это не работает
Итак, почему я использую более одного окна проверки? -. Потому что я не уверен, что окно всегда на всех пространствах. По крайней мере, System Status Item Clone
и Finder
не всегда есть.
Вот моя реализация добавить эту функцию в категории до 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;
}