Windowキャプチャの動作がおかしい。調べると全ウィンドウの範囲を計算するメソッドが原因だった。
+ (NSRect)unionNSRectWithWindowList:(NSArray*)list
{
NSRect all_rect = NSZeroRect;
NSRect rect;
for(Window* window in list) {
rect = [window rect];
if (NSEqualRects(all_rect, NSZeroRect)) {
all_rect = rect;
} else {
all_rect = NSUnionRect(all_rect, rect);
}
}
all_rect.origin = [CoordinateConverter convertFromLocalToCGWindowPoint:all_rect.origin];
return all_rect;
}
前回 Windowクラスの座標系はすべてローカル座標系に変えてしまった。一方、このメソッドの結果は CGWindow系で使われている。
調査したところ、このメソッドは CGWindowでしか利用していなかったので今回は安易だがメソッド内で変換してしまう。
all_rect.origin = [CoordinateConverter
convertFromLocalToCGWindowPoint:all_rect.origin]; // 追加
return all_rect;
これでOK。
- - - -
マルチスクリーンに関連するバグフィックスはこれで(多分)全部片づいた。最初から異なる座標系を意識していればこんなに苦労しなかった。次?は是非最初から座標系の変換を実装に盛り込みたい。