ページ

2008年7月17日木曜日

SimpleCap (22)ウィンドウトラッキング(2)

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

前回の続き。
新たに "Track Window" をメニューに追加した。


この処理を行なう為に新たに TrackWindowHandler: HandlerBase を追加した。
キャプチャ開始後にタイマーをしかけ、0.1秒毎にウィンドウの最新位置をチェックしている。

0.1秒毎に呼出されるコールバックメソッド。

- (void)callBack:(NSTimer*)timer
{
if ([self updateWindows]) {
[self updateButtonWindow];
CaptureView* view = [_capture_controller view];
[view setNeedsDisplay:YES];
} else {
   :


#updateWindows がトラッキング対象のウィンドウ位置の更新。
- (BOOL)updateWindows
{
// sort by lastest order
CFArrayRef window_list = [self getWindowListWindowID:[_capture_controller windowID]];
CFDictionaryRef window;
CFIndex i, j=0;
CGWindowID window_id;
BOOL is_exists = NO;
CGRect cgrect = CGRectZero;
for (i=0; i < CFArrayGetCount(window_list); i++) {
window = CFArrayGetValueAtIndex(window_list, i);
CFNumberGetValue(CFDictionaryGetValue(window, kCGWindowNumber),
kCGWindowIDCFNumberType, &window_id);
if ([self isWindow:window normalWindow:YES]) {
j++;
}
if (window_id == _tracked_window_id) {
CGRectMakeWithDictionaryRepresentation(CFDictionaryGetValue(window, kCGWindowBounds), &cgrect);
_tracked_window_rect = NSRectFromCGRect(cgrect);
if (j == 1) {
[self changeState:STATE_SELECTED];
} else {
[self changeState:STATE_HIDE];
}
is_exists = YES;
break;
}
}
CFRelease(window_list);
return is_exists;
}


ウィンドウが閉じられている場合は is_exists == NO が戻る。

ボタンの位置調整 #updateButtonWindow はベタな処理。
#define BUTTON_OFFSET 10.0
- (void)updateButtonWindow
{
NSScreen* screen = [NSScreen mainScreen];
NSRect srect = [screen frame];
NSPoint p = _tracked_window_rect.origin;
NSSize wsize = [_tool_window frame].size;
p.x = p.x + _tracked_window_rect.size.width - wsize.width - BUTTON_OFFSET;
p.y = srect.size.height - wsize.height - p.y - BUTTON_OFFSET;

[_tool_window setFrameOrigin:p];
}