ページ

2009年3月7日土曜日

β版バグ修正 - マルチスクリーン(その3)

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

昨日考えたロジックの実装に入る。

まず範囲選択キャプチャを行うメソッドに手を入れる。

NSRect s_rect = _rect;
s_rect.origin = [self convertFromLocalToCGWindowPoint:_rect.origin];
CGImageRef cgimage = CGWindowListCreateImage(NSRectToCGRect(s_rect), option,
[_capture_controller windowID],
kCGWindowImageDefault);

以前はローカル座標系の範囲 _rect を直接 CGWindowListCreateImage へ渡していたが、#convertFromLocalToCGWindowPoint: を使い CGWindow関数の座標系へ変換をかける。#convertFromLocalToCGWindowPoint のコードは次の通り。
- (NSPoint)convertFromLocalToCGWindowPoint:(NSPoint)from_p
{
CGFloat cx1, cy1, lx1, ly1, sx1, sy2;
NSRect frame = [Screen frame];
NSRect m_frame = [[NSScreen mainScreen] frame];

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

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

return NSMakePoint(cx1, cy1);
}

昨日の数式をそのまま実装しただけ。Screen#frame は全画面の範囲を返す。

さて実行してみよう、といきたいところだが、あいにく今はマルチスクリーンを試せる環境が無い。とりあえずシングルスクリーンで動作確認を取っておく。


大丈夫そうだ。

- - - -
マルチスクリーン環境は職場でないと試せないので月曜日に出社した時に試してみる。


(6/11追記)数式に一部誤りあり。下記を参照のこと。
β版バグ修正 - マルチスクリーン(検証) CommentsAdd Star