Обнаружение, когда пространство изменяется в пространстве в Mac OS X

Скажем, я хочу написать простое приложение Cocoa, чтобы сделать функцию Spaces Leopard более полезной. Я хотел бы настроить каждое пространство, чтобы иметь, скажем, разные

  • Разрешение экрана
  • раскладки клавиатуры
  • том (для аудио)

Итак, у меня есть две части:

  • Я полагаю, есть способы изменить эти три вещи независимо от пространств, так? Если да, то как?
  • Как я могу обнаружить в своем приложении, когда происходит изменение пространства, и когда это произойдет, определите, в каком пространстве просто переключился пользователь? Предоставляет ли Leopard некоторые распространенные уведомления или что-то еще?

Обновление. Должен быть какой-то открытый API-интерфейс для этого, судя по всем приложениям, связанным с пространством, в Mac App Store.

Ответ 1

Как говорит Питер, в 10.6 вы можете использовать NSWorkSpace NSWorkspaceActiveSpaceDidChangeNotification для получения уведомления при изменении рабочего пространства.

Затем вы можете определить текущее пространство с помощью API Quartz, ключ словаря kCGWindowWorkspace держит рабочую область. например:

int currentSpace;
// get an array of all the windows in the current Space
CFArrayRef windowsInSpace = CGWindowListCopyWindowInfo(kCGWindowListOptionAll | kCGWindowListOptionOnScreenOnly, kCGNullWindowID);      

// now loop over the array looking for a window with the kCGWindowWorkspace key
for (NSMutableDictionary *thisWindow in (NSArray *)windowsInSpace)
{
     if ([thisWindow objectForKey:(id)kCGWindowWorkspace])
       {
           currentSpace = [thisWindow objectForKey(id)kCGWindowWorkspace] intValue];
           break;
       }
}

В качестве альтернативы вы можете получить пространство с помощью частного API, посмотрите CGSPrivate.h, который позволяет это сделать:

int currentSpace = 0;
CGSGetWorkspace(_CGSDefaultConnection(), &currentSpace);

Чтобы изменить разрешение экрана, вы хотите посмотреть Quartz services, для изменения объема это может быть полезно.

Ответ 2

NSWorkspace размещает a NSWorkspaceActiveSpaceDidChangeNotification в своем собственном центре уведомлений, но только на Snow Leopard.