Leopard から導入された Spaces
現在表示しているアクティブな space(workspace?)をプログラム内で得る方法は今のところプライベート関数を使うしかないようだ。
detecting when the active space changes under leopard / entries / tonyarnold.com
CocoaDev: CoreGraphicsPrivate
上記を参考にしてサンプルを書いてみた。CGSGetWorkspace を使う。
typedef int CGSConnection;
extern OSStatus CGSGetWorkspace(const CGSConnection cid, int *workspace);
@implementation ActiveSpaceAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
int spaceNumber = -1;
int cid=[NSApp contextID];
CGSGetWorkspace(cid, &spaceNumber);
NSLog(@"spaceNumber=%d", spaceNumber);
}
CGSGetWorkspace へ渡す CGSConnection には -[NSApplication contextID] が使える。ただこれも非公開メソッド。Xcodeでコンパイルすると Warning が出る。
実行するとログへ実行時の space番号が書き出される。
2009-12-30 07:26:00.155 ActiveSpace[2348:80f] spaceNumber=2
Workspace関係では他にこんなのがあった。
extern OSStatus CGSGetWorkspaceWindowCount( const CGSConnection cid, int workspaceNumber, int *outCount); extern OSStatus CGSGetWorkspaceWindowList( const CGSConnection cid, int workspaceNumber, int count, int* list, int* outCount);
指定した Workspace内のウィンドウの数やリストが取得できるようだ。
他にも面白そうな関数がいくつかある。プライベート関数なので使い方が難しいが機会があったら他も試してみたい。
- - - -
なお SimpleCap で使っている CGWindow 系の関数で取得できるウィンドウ情報には、そのウィンドウが表示されている Workspace も含まれる。
CGWindow.h
/* Optional: The value for this key is a CFNumberRef encoding as a kCFNumberIntType
* the workspace the window is associated with. */
CG_EXTERN const CFStringRef kCGWindowWorkspace AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER;
サンプルコードあり:GitHub からどうぞ
ActiveSpace at master from xcatsan's SampleCode - GitHub