今日も風邪のため本の紹介のみ。
本屋で見つけた本。
入門書は数多くあれど実践的な本は少ない。Rails(Rubyも)は仕事で使っていないが考え方は参考になる。PHP でこういう実用的な本があると助かるのだが。
今日も cocoa と無関係だ。
2009年4月4日土曜日
2009年4月3日金曜日
2009年4月2日木曜日
iLingualを試す(その2)
2009年4月1日水曜日
iLingualを試す
2009年3月31日火曜日
ローカライズツール iLingual
ローカライズの情報を集めていたらこんなツールを見つけた。
iLingual
http://homepage.mac.com/nsekine/SYW/SYWSoft/softOSX.html#iLingual
PISCES での紹介記事
http://pisces-319.seesaa.net/article/71705307.html
面白い。フリーウェアのローカライズは無料ということなので試してみよう。
2009年3月30日月曜日
β版リファクタリング - 座標変換メソッドを切り出す(2)
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。
- - - -
マルチスクリーンに関連するバグフィックスはこれで(多分)全部片づいた。最初から異なる座標系を意識していればこんなに苦労しなかった。次?は是非最初から座標系の変換を実装に盛り込みたい。
2009年3月29日日曜日
β版リファクタリング - 座標変換メソッドを切り出す
座標変換のメソッドは各所で使う事になるので専用のクラスを用意してここにまとめることにする。
@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;
}
動作確認は明日マルチスクリーン環境で。
登録:
投稿 (Atom)





