ページ

2009年1月8日木曜日

マルチスクリーン対応(2)NSScreen検証

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

マルチスクリーン(2つ以上画面デバイスがある状態)の時のNSScreen を調査してみた。
簡単な調査コードを書いて、2つのスクリーンの関係によって NSScreen からどんな情報が得られるかを調べてみた。

サンプル:StudyMutiScreen.zip

実行するとコンソールへスクリーンの数だけ下記のような情報を書き出す。

StudyMutiScreen[8789:10b] depth:520
frame:{{0, 0}, {1600, 1024}}
userSpaceScaleFactor:1.000000
visibleFrame:{{0, 94}, {1600, 908}}
deviceDescription:{
NSDeviceBitsPerSample = 8;
NSDeviceColorSpaceName = NSCalibratedRGBColorSpace;
NSDeviceIsScreen = YES;
NSDeviceResolution = NSSize: {72, 72};
NSDeviceSize = NSSize: {1600, 1024};
NSScreenNumber = 69502301;
}
StudyMutiScreen[8789:10b] depth:520
frame:{{1600, 170}, {1280, 854}}
userSpaceScaleFactor:1.000000
visibleFrame:{{1600, 170}, {1280, 854}}
deviceDescription:{
NSDeviceBitsPerSample = 8;
NSDeviceColorSpaceName = NSCalibratedRGBColorSpace;
NSDeviceIsScreen = YES;
NSDeviceResolution = NSSize: {72, 72};
NSDeviceSize = NSSize: {1280, 854};
NSScreenNumber = 69666816;
}



この中で frameとvisibleFrame に注目して追っていってみよう。
以下、大きい方の画面は 20インチ外付けディスプレイ、小さい方の画面は PowerBookG4の 15インチディスプレイ。
メニューバーは前者についている。それぞれのサイズは次のようになる。
20'外付け:{1600, 1024}
15'ノート:{1280, 854}



20'外付け:
  frame:{{0, 0}, {1600, 1024}}
  visibleFrame:{{0, 94}, {1600, 908}}
15'ノート:
  frame:{{1600, 170}, {1280, 854}}
  visibleFrame:{{1600, 170}, {1280, 854}}




20'外付け:
  frame:{{0, 0}, {1600, 1024}}
  visibleFrame:{{0, 94}, {1600, 908}}
15'ノート:
  frame:{{-1280, 170}, {1280, 854}}
  visibleFrame:{{-1280, 170}, {1280, 854}}




20'外付け:
  frame:{{0, 0}, {1600, 1024}}
  visibleFrame:{{0, 0}, {1600, 1002}}
15'ノート:
  frame:{{0, -854}, {1280, 854}}
  visibleFrame:{{0, -767}, {1280, 767}}



結果を見ると、メニューバーのあるウィンドウの左下が原点(0,0)になっていることがわかる。
他のウィンドウは、例えば右隣にある場合はメニューバーのウィンドウの幅の分だけ右にスクリーン位置がずれている。
20'外付け:
  frame:{{0, 0}, {1600, 1024}}
15'ノート:
  frame:{{1600, 170}, {1280, 854}}

左隣にある場合は、逆に自分の幅だけ左、すなわちマイナス座標に位置する。
20'外付け:
  frame:{{0, 0}, {1600, 1024}}
15'ノート:
  frame:{{-1280, 170}, {1280, 854}}


ところでメニューバーウィンドウは大きさ(frame)と可視領域(visibleFrame)には、上部 22ドット分、下部 94ドット分の差がある。
20'外付け:
  frame:{{0, 0}, {1600, 1024}}
  visibleFrame:{{0, 94}, {1600, 908}}
※原点は左下

サイズからして恐らく上の 22ドットはメニューバー、下はDockの高さだと思われる。
実際、Dockのサイズを変更すると、この値も変わった。

- - - -
なおマルチースクリーン下で NSScreen#mainScreen を呼び出した時に返される NSScreenは次のようになっていた。
 (1) アクティブなウィンドウが存在するスクリーン
 (2) 上記ウィンドウがスクリーンをまたがる場合は、面積の大きい方

(2)は本当にそうなのかは分からないが検証ではそのようなルールに従っているように見えた。