ページ

2009年6月12日金曜日

SimpleCapバグ修正 - マルチスクリーン

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

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)

- - - -
直しているうちに別のバグを発見した。
やはりマルチスクリーンで利用している時にスクリーン配置の特定のケースで、ウィンドウキャプチャの表示がおかしいことがわかった。