SYさんよりマルチスクリーンでバグがあるとの報告を受けた。
SimpleCap その後 〜コメント〜
マルチスクリーンでメニューバーが存在する画面のサイズが他よりも小さい場合に現象が発生する。例えば下記のケース。
以前、マルチスクリーンを手直した時にはこのケースは試していなかったので気がつかなかった。
調べると原因は [NSScreen mainScreen] の動作を誤解していることにあった。
NSScreen Class Reference - mainScreen
てっきりこのメソッドはメニューバーのある画面を返すものとばかり思っていたのだがそうではなく、リファレンスによるとキーボードイベントを受け付けるウィンドウが存在するスクリーンが "main screen"とのこと。
メニューバーを含むウィンドウは
The screen containing the menu bar is always the first object (index 0) in the array returned by the screens method.
と書いてあった。つまり [NSScreen screens] で返される配列の最初のスクリーンがメニューバーを持つということ。そういえば以前読んだような気もする。
これらを元に座標系変換の実装を下記のように修正した。
(誤) NSRect m_frame = [[NSScreen mainScreen] frame];
(正) NSRect m_frame = [[[NSScreen screens] objectAtIndex:0] frame];
これでなおった。やれやれ。
座標変換のロジックが間違ってなかっただけ良かった。
SimpleCapにおけるマルチスクリーンでの座標変換ロジックはこのあたりで紹介している。
β版バグ修正 - マルチスクリーン
β版バグ修正 - マルチスクリーン(その2)
- - - -
直しているうちに別のバグを発見した。
やはりマルチスクリーンで利用している時にスクリーン配置の特定のケースで、ウィンドウキャプチャの表示がおかしいことがわかった。