マルチスクリーン(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)は本当にそうなのかは分からないが検証ではそのようなルールに従っているように見えた。