Обнаружение, когда пространство изменяется в Пространствах в Mac OS X
Допустим, я хочу написать простое приложение Cocoa, чтобы сделать функцию "Пространства" в Leopard более полезной. Я хотел бы настроить каждое пространство, чтобы, скажем, разные
- разрешение экрана
- раскладки клавиатуры
- громкость (для аудио)
Итак, на мой вопрос есть две части:
- Я полагаю, есть способы изменить эти три вещи независимо от пробелов, верно? Если так, то как?
- Как я могу обнаружить в своем приложении, когда происходит изменение пространства, и когда это происходит, определить, на какое пространство пользователь только что переключился? Leopard отправляет какие-то распределенные уведомления или что-то?
Обновление: должен быть какой-то общедоступный API-способ сделать это, судя по всем связанным с Spaces приложениям в Mac App Store.
2 ответа
Как говорит Питер, в 10.6 вы можете использовать NSWorkSpace
NSWorkspaceActiveSpaceDidChangeNotification
получить уведомление при изменении рабочей области.
Затем вы можете определить текущее пространство с помощью 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(), ¤tSpace);
Чтобы изменить разрешение экрана, вам нужно посмотреть на сервисы Quartz, для изменения громкости это может быть полезно.
NSWorkspace публикует NSWorkspaceActiveSpaceDidChangeNotification
на своем собственном центре уведомлений, но только на Snow Leopard.