Let\'s say I want to write a simple Cocoa app to make the Spaces feature of Leopard more useful. I would like to configure each space to have, say, different
As Peter says, in 10.6 you can use the NSWorkSpace
NSWorkspaceActiveSpaceDidChangeNotification
to get a notification when the workspace changes.
You can then determine the current space using Quartz API, the kCGWindowWorkspace
dictionary key holds the workspace.
e.g:
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;
}
}
Alternatively you can get the Space using the private API, take a look at CGSPrivate.h which allows you to do this:
int currentSpace = 0;
CGSGetWorkspace(_CGSDefaultConnection(), ¤tSpace);
To change the screen resolution you'll want to look at Quartz services, for altering the volume this may be helpful.
NSWorkspace posts a NSWorkspaceActiveSpaceDidChangeNotification
on its own notification center, but only on Snow Leopard.