2011年2月7日月曜日

Cocoa ObjC NSWindow setCollectionBehaviorのふるまい

透明ウィンドウが表示できたので、今度はその上でマウスホイールをころころさせたらworkspaceを切り替えられるようにする。

MacRubyで書いたrubyのコードを参照しながら作業。とりあえず全部のworkspaceで透明ウィンドウを表示できるようにした。

MacRubyの時は
my_window.setCanBeVisibleOnAllSpaces(true)

としていたが、ObjCだとDeprecatedだといわれる。そういえばそんなことをxcatsan師匠も書いていたぞ。そのかわりsetCollectionBehaviorを使え、ということなのでデベロッパドキュメントで調べてみる。ここでやりたいことを実現するには

[window setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
と書けばよかった。

setCollectionBehaviorはOSX10.5以降に追加されたメソッドで、「Window collection behaviors related to Exposé and Spaces.」だそうで、以下のようなenumが定義されている。

enum {
   NSWindowCollectionBehaviorDefault = 0,
   NSWindowCollectionBehaviorCanJoinAllSpaces = 1 << 0,
   NSWindowCollectionBehaviorMoveToActiveSpace = 1 << 1
};
enum {
   NSWindowCollectionBehaviorManaged = 1 << 2,
   NSWindowCollectionBehaviorTransient = 1 << 3,
   NSWindowCollectionBehaviorStationary = 1 << 4,
};
enum {
   NSWindowCollectionBehaviorParticipatesInCycle = 1 << 5,
   NSWindowCollectionBehaviorIgnoresCycle = 1 << 6
};
typedef NSUInteger NSWindowCollectionBehavior;
最初の3つがSpaces.appの関係のふるまい。
NSWindowCollectionBehaviorDefault
デフォルト。アプリケーションは一時にひとつのSpaceにしか表示できない。
NSWindowCollectionBehaviorCanJoinAllSpaces
アプリケーションは全てのSpaceに表示される。メニューも同じ。
NSWindowCollectionBehaviorMoveToActiveSpace
アプリケーションをアクティブにした時、Spaceを切り替えずに、現在アクティブなSpaceに表示する。これはSpaces.appの設定で、Spacesを切り替える、というオプションがあるのでそれ関係か。 次の3つがExposé関係のふるまい。(Spacesにも関係するけど)
NSWindowCollectionBehaviorManaged
Spacesの一覧表示、Exposéの表示にウィンドウが表示される。NSNormalWindowLevelで表示されているウィンドウのふつうの状態。
NSWindowCollectionBehaviorTransient
こっちはNSNormalWindowLeveではない時の普通の状態。試してないのでいったいどーなるのだか。解説によればSpacesの一覧では表示されるけどExposéでは表示されないようだ。
NSWindowCollectionBehaviorStationary
Spaces、Exposé両方でデスクトップのようにふるまう。 以下の2つは「Cycle Through Windows Window menu item」に関連するんですが、Cycle Through Windows Window menu itemって何?なのでよくわからず。
NSWindowCollectionBehaviorParticipatesInCycle
参加する。
NSWindowCollectionBehaviorIgnoresCycle
参加しない(^^;)。 というわけで今のところ、実験用プロジェクトではこう書いている。
[window setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces | NSWindowCollectionBehaviorStationary | NSWindowCollectionBehaviorIgnoresCycle];
全部のSpacesに図々しく現れるわりに、Exposéとかからには隠れているいるという感じ。 本日はこんなところで終了してしまった。ちょっとずついろいろ確かめながら進む、という姿勢もxcatsan師匠から教わったひとつだな。

0 件のコメント:

コメントを投稿