ページ

2009年12月30日水曜日

Spaces - アクティブなspaceの番号を得る(プライベート関数使用)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

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