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

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

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

Итак, на мой вопрос есть две части:

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

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

2 ответа

Решение

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

Затем вы можете определить текущее пространство с помощью Quartz API, 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;
       }
}

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

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

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

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

Другие вопросы по тегам