2012-06-15 1 views
2

Пример кодаКак проверить, что текущее пространство - это панель инструментов?

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

Тогда

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

Я хочу, чтобы проверить, является ли текущее пространство приборной панели или нет? Есть идеи?

ответ

3

Первое, что я пробовал, - это получить идентификатор текущего места в соответствии с этим ответом: 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; 

}

Смежные вопросы