ページ

2008年12月3日水曜日

SimpleCap ウィンドウ選択をキーボードで行う

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

キー周り最後の仕上げ。ウィンドウ選択時に、矢印キーでウィンドウ選択切り替える機能を追加する。例えば、上矢印キーを押すと現在選択されているウィンドウの一つ上に選択状態が移る。




これを実現するには画面に表示されているウィンドウのリストを座標でソートする必要がある。SimpleCapではウィンドウ一覧(配列)を取得するメソッドを元々用意していたのでこれを元にソート処理を実装する。配列のソート方法は NSArray#sortedArrayUsingSelector: を使ってオブジェクト自身にソートロジックを実装することが多い。今回はこれを使わず NSArray#sortedArrayUsingFunction:context: を使ってみた。今回のケースでは矢印キーの方向によってソート対象を X座標、Y座標と切り替える必要があったのがその理由。

ソート処理を行う関数はこんな感じ。

HandlerBase.m

NSInteger window_comparator(Window* window1, Window* window2, void *context)
{
NSRect rect1 = [window1 rect];
NSRect rect2 = [window2 rect];

CGFloat v1, v2;

if ([(NSNumber*)context boolValue]) {
v1 = rect1.origin.x;
v2 = rect2.origin.x;
} else {
v1 = rect1.origin.y;
v2 = rect2.origin.y;
}

if (v1 < v2) {
return NSOrderedAscending;
} else if (v1 > v2) {
return NSOrderedDescending;
} else {
return NSOrderedSame;
}
}



ソート済みのウィンドウリストを作る部分。
- (NSArray*)getSortedWindowListDirection:(BOOL)direction
{
NSArray* list = [self getWindowList];
NSArray* sorted_list =
[list sortedArrayUsingFunction:window_comparator
context:[NSNumber numberWithBool:direction]];

return sorted_list;
}


後は押された矢印キーによってこのリスト上で前後のウィンドウを取得し選択状態にすれば良い。