2011年2月19日土曜日

Cocoa ObjC 起動中のアプリをSpacesごとに表示する

起動しているアプリを、表示しているWorkspaceごとに区分けして表示してみる。

ウィンドウを一つしか開かないアプリなら話は簡単だけれど、たくさんウィンドウを開くアプリの扱いで悩む。

とりあえず、開いているウィンドウを「1つのアプリ」とみなして表示する。こんな感じ。


現在のXcode3.2.5だとやたらたくさんウィンドウを開くことになるので、画像のようなことになる。試しにWorkspace4にデベロッパドキュメントのウィンドウを開いている。これをクリックすると、残念ながら「Xcodeの現在のアクティブなウィンドウ」がアクティブになる。


dockの右クリックで開くメニューの、一番最初に表示されているウィンドウが開く、と。

それなら、同じアプリのウィンドウは1つのWorkspaceにつき1つだけ表示するようにしてみる。


これならまあまあ、というところか。Workspace4のXcodeのアイコンをクリックするとWorkspace2のXcodeがアクティブになるのは相変わらず。(これはきっとどこかにどうにかするプライベート関数があるのではないか、と思ってずっと探しているが、まだみつからない。特定のウィンドウを選択してアプリをアクティブにする・・・できないかなあ)

ここまでの問題点は

1,ウィンドウの選択ができない
2,「全てのWorkspaceに表示する」を設定しているアプリが拾えない
3,Finderのアクティブ化が想定したようにならない
4,最小化しているアプリを拾っていない

という感じ。1は今のところどーにもならない。2は本日気づいた。


iTermを「全ての操作スペース」で表示する、にしたところ、「起動中のアプリ」として拾えなくなった。

これは原因はわかっていた、CGWindowListCopyWindowInfo( kCGWindowListOptionAll , kCGNullWindowID)で全ウィンドウの情報を取得して、
if (CFDictionaryContainsKey(w, kCGWindowWorkspace)) {
とWorkspace番号をもっているアプリだけ拾っているから。「全ての操作スペースで・・・」を選択しているアプリは、Workspace番号を持っていない。


ちなみに画像はxcatsan師匠がCGWindowListCopyWindowInfoのサンプルとして作ったツール。私のために作ってくれた(^^;)ようなツールでめちゃ使えますな。

3のFinder関連は、「現在のWorkspaceにFinderのウィンドウがないときはメニューバーでFinderがアクティブになるだけ」という現象。Fiderで一つでもウィンドウが開いているなら、それがアクティブになってほしいのだけれど、残念ながらそうはならない。Workspace1にFinderのウィンドウがなくて、Workspace2にFinderのウィンドウが一つ開いている、という状態だとすると、Workspace2でFinderのアイコンをクリックすると開いているウィンドウがアクティブになるけれど、Workspace1だとメニューバーでFinderがアクティブになってしまう、という感じ。

OSX、けっこうクセがありますなあ。

というわけで、Workspaceの操作とタスクスイッチャをいっしょにするにはちょっと無理がある、という結論に傾きつつある。

ワークスペース切替器とタスクスイッチャは別物として作ったほうがいいようだ。

0 件のコメント:

コメントを投稿