前回までに作ったサンプルプログラムを使ってウィンドウリストを見ていく。
まずはシステムメニュー。SystemUIServerが管理している。これもウィンドウ扱いなのか。
メニューの中でも右にある一連のステータスバーは別ウィンドウになっている。描画上、左のメニューとは別管理になっていることがわかる。
続いて Dock。これは NSRect{0, 22, 1440, 878}となっていて一番上のメニューを除く画面領域全体を示している。つまりアイコンが表示されている所だけでなく、それ以外の画面全体で描かれる Dock関連のアニメーションなどは、普段透明なこのウィンドウに描かれるということか。
アイコンが載っている部分は "Magic Mirror"と呼ばれていて、わざわざ一つのウィンドウが割り当てられている。
次は kCGWindowListExcludeDesktopElements オプションを外してみる。すると Finder関連のウィンドウがたくさん出てくる。一つずつ見ていくと、その大半がデスクトップ上に表示されているアイコンであることがわかる。おお、アイコン1個が1つのウィンドウになっているのか。面白い。デスクトップ上のアイコンのドラックは、実はウィンドウをドラックしていたことになるのか。
続いて kCGWindowListOptionOnScreenOnly チェックを外す。すると非表示状態のウィンドウもリストに出てくる。表一番右に "Workspace" というカラムあるが、これは Speces.app で表示している画面番号を表す。この表では仮想画面の "4" や "3" にあるウィンドウが掲載されている。つまり、Speces.app は画面を切り替える時に隠れるウィンドウ群を単純に非表示にしていることがわかる(当たり前の動作だけど)。
最後に "Desktop"。これは画面全体{1440,900}を覆っていて Window Serverが管理している。これは壁紙を描くエリアだろうか?同様に Finderも画面全体を覆う(透明な)ウィンドウを確保している。レイヤーは最下層の一つとなっているのでデスクトップ上へのドラック操作などは、このFinderのウィンドウが引き受けているのかもしれない。ただ順番は Desktop(WindowServer) -> Finder となっているので、この仮説だと Desktopが先にドラッグを処理してしまいそうだが。
- - - -
こうしてみると普段見ている MacOSXの画面は基本的にウィンドウで構成されていることがわかる。Dockもしかり、Finderもしかり。中でも一番興味負深かったのがデスクトップ上のアイコン。これがウィンドウだったとは。しかし、これがウィンドウということはデスクトップに大量にアイコンがあると、それだけメモリを食うってことになるな。それにドラッグ&ドロップした時のイベントハンドリングも、たくさんアイコンがあると負荷がかかる可能性がありそうだ。今回は調査していて楽しかったけど、ウィンドウを使えば基本なんでも描画できることがわかったのが一番の収穫だった。今回までの検証成果はいずれ SimpleCapへ反映する。