座標変換のメソッドは各所で使う事になるので専用のクラスを用意してここにまとめることにする。
@interface CoordinateConverter : NSObject {
}
+ (NSPoint)convertFromLocalToCGWindowPoint:(NSPoint)from_p;
+ (NSPoint)convertFromCGWindowPointToLocal:(NSPoint)from_p;
@end
とりあえずインスタンスは必要なさそうなのでクラスメソッドとして定義した。
内容は以前定義したものと同じ。
これで座標変換メソッドが利用しやすくなった。これを Windowモデルで使い、内部管理の座標系を CGWindowからローカル座標系へ切り替える。
Windowモデル(クラス)は CGWindow系関数で取得したウィンドウの情報を保持するクラス。定義はこんな感じ。
@interface Window : NSObject {
int _order;
CGWindowID _window_id;
int _owner_pid;
NSString* _window_name;
NSString* _owner_name;
int _layer;
NSRect _rect;
NSImage* _image;
}
このイニシャライザ #initWithWindowDictionaryRef: の中で _rectへ格納する時に座標変換を行っておく。
- (id)initWithWindowDictionaryRef:(CFDictionaryRef)window
{
self = [super init];
if (self) {
CGRect cgrect;
CFNumberGetValue(CFDictionaryGetValue(window, kCGWindowNumber),
kCGWindowIDCFNumberType, &_window_id);
CFNumberGetValue(CFDictionaryGetValue(window, kCGWindowOwnerPID),
kCFNumberIntType, &_owner_pid);
CFNumberGetValue(CFDictionaryGetValue(window, kCGWindowLayer),
kCFNumberIntType, &_layer);
CGRectMakeWithDictionaryRepresentation(CFDictionaryGetValue(window, kCGWindowBounds), &cgrect);
_window_name = (NSString*)CFDictionaryGetValue(window, kCGWindowName);
_owner_name = (NSString*)CFDictionaryGetValue(window, kCGWindowOwnerName);
[_window_name retain];
[_owner_name retain];
_rect = NSRectFromCGRect(cgrect);
_rect.origin = [CoordinateConverter convertFromCGWindowPointToLocal:_rect.origin];
}
return self;
}
動作確認は明日マルチスクリーン環境で。