スクリーンキャプチャのソフトを作っているが画面を覆う1枚のウィンドウを使っている。ところが Spaces.appで画面が移動されるとこのウィンドウが隠れてしまい移動先の画面でキャプチャができない。Spaces.appで画面を移動してもこのウィンドウを常に表示させておきたい。
NSWindow.h を眺めていると次のメソッドを見つけた。
おお使えそうだ。で、使ってみたらうまくいった。常時表示したい NSWindowに対して setCanBeVisibleOnAllSpaces:YES を投げてやると、Spaces.appで画面を移動しても常にそのウィンドウが表示される。
が、deprecated扱いだ。
そもそも ADCのリファレンスにもこのメソッドは載っていないな(ヘッダのコメントも DEPRECATEDと記載がある)。
しかたなく NSWindow.h をまた眺める。するとあった。setCollectionBehavior: 。これは ADCのリファレンスにも載っている。
NSWindow#setCollectionBehavior:
早速試してみる。
ソース:SpacesStudy.zip
チェックが外れた状態がデフォルト。この状態では Spaces.appで画面を切り替えるとウィンドウは隠れてしまう。そこでチェックを入れる。すると NSWindowCollectionBehaviorCanJoinAllSpaces がセットされ、Spaces.appで画面を切り替えてもウィンドウが常に表示されるようになる。ただ、ちと気味が悪い動きだ。。
チェックボックスのアクションコード
- (IBAction)click:(id)sender
{
NSLog(@"%d", [sender intValue]);
if ([sender intValue]) {
[window setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
} else {
[window setCollectionBehavior:NSWindowCollectionBehaviorDefault];
}
}
- - - -
リファレンスによるともう一つ NSWindowCollectionBehaviorMoveToActiveSpaceというのがある。ウィンドウ(アプリ)をアクティブにした時、表示中のSpaceにウィンドウが表示されるものなのかと思ったが、NSWindowCollectionBehaviorDefault(デフォルト)と変わらないようだ。使い方がまずいのか?