ページ

2009年3月21日土曜日

β版バグ修正 - マルチスクリーン(ウィンドウ)

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

スクリーン配置によってウィンドウキャプチャも表示が変になっているのに気が付いた。

例えば上にサブ画面、下にメイン画面があった場合。


ウィンドウキャプチャを起動すると下の画面のウィンドウが選択状態になるのだが、上のサブ画面に選択ウィンドウの画像が表示されてしまう。


これは以前調査した通り座標系の問題。
β版バグ修正 - マルチスクリーン(その2)
http://xcatsan.blogspot.com/2009/03/blog-post_06.html

内部的にウィンドウを管理している座標系が CGWindowなのに対して、ウィンドウを描画する座標系がカスタムビューのローカル座標であるのが原因。CGWindow系からローカル座標系へ変換してやればいいだろう。
以前、ローカル座標系からCGWindow系へ変換するメソッド #convertFromLocalToCGWindowPoint: を用意した。ここでは下記の数式を使っていた。

・スクリーン座標系上での全画面範囲(左下)-(右上):(sx1, sy1)-(sx2, xy2)
・メイン画面のサイズ(幅・高さ):(sw, sh)
・ローカル座標系上でキャプチャした範囲選択の開始点(左上):(lx1, ly1)
・CGWindow関数へ渡す開始点(左上):(cx1,cy1)

cx1 = lx1 + sx1
cy1 = ly1 - (sy2 - sh)



この最後数式を入れ替えれば逆変換になる。

lx1 = cx1 - sx1
ly1 = cy1 + (sy2 - sh)


この変換を行うメソッド #convertFromCGWindowPointToLocal: を用意し、これを使うように修正してみた。

- (NSPoint)convertFromCGWindowPointToLocal:(NSPoint)from_p
{
CGFloat cx1, cy1, lx1, ly1, sx1, sy2;
NSRect frame = [[Screen defaultScreen] frame];
NSRect m_frame = [[NSScreen mainScreen] frame];

CGFloat sh = m_frame.size.height;
cx1 = from_p.x;
cy1 = from_p.y;
sx1 = frame.origin.x;
sy2 = frame.origin.y + frame.size.height;

lx1 = cx1 - sx1;
ly1 = cy1 + (sy2 - sh);

return NSMakePoint(lx1, ly1);
}



実行してみる。


今度は大丈夫だ。

ただボタンの位置がおかしい??