ホットキー登録ができるようになったので今度は登録キーの表示を行う。以前の検証を思い出しつつ Hotkeyクラスを拡張して表示ロジックを組み込む。動作確認の為、前回のサンプルにキーを表示させてみよう。
まずキーの文字表現から。以前の設計では HotkeyCharConverter なんて大げさな名前のクラスを用意するつもりだったが、ホットキー用のモデルクラス Hotkey を用意することになったので、ここに文字表現の責務を持たせることにする。
Hotkey を次のように拡張する。
Hotkey.h
@class HotkeyRegister;
@interface Hotkey : NSObject {
:
}
- (NSString*)string;
- (BOOL)isHotkey;
@end
- [Hotkey string] で修飾キーを含めた文字表現を取得できる。
例えば Command+Option+P なら @"⌥⌘P" を返す。
実装はこんな感じ。まずマッピング用の構造体配列を定義する。
Hotkey.m
static const struct {
UInt32 keycode;
NSString* description;
NSString* string;
BOOL is_hotkey;
}
keymap[] = {
{ kVK_ANSI_A, @"A" , @"A" , YES },
{ kVK_ANSI_S, @"S" , @"S" , YES },
:
続いて追加メソッドの実装。
- (NSString*)string
{
NSString* key_desc = @"";
if (self.modifier & controlKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kControlUnicode];
}
if (self.modifier & optionKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kOptionUnicode];
}
if (self.modifier & cmdKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kCommandUnicode];
}
if (self.modifier & shiftKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kShiftUnicode];
}
key_desc = [key_desc stringByAppendingFormat:@"%@", _keymap[[self indexOfKeymap]].string];
return key_desc;
}
- (BOOL)isHotkey
{
return _keymap[[self indexOfKeymap]].is_hotkey;
}
それとキーマップのインデックスを取得するメソッドを用意。
- (UInt32)indexOfKeymap
{
UInt32 index;
UInt32 max = sizeof(_keymap)/sizeof(_keymap[0]);
for (index=0; index < max; index++) {
if (_keymap[index].keycode == self.code) {
break;
}
}
if (index == max) {
index = 0; // DUMMY
}
return index;
}
さて実行してみよう。今回は押したキーの文字表現をデバッガコンソールへ表示するようにしてみた。
@implementation AppController
- (void)keyDown:(Hotkey*)hotkey
{
NSLog(@"keyDown: keycode=%x [%@]", hotkey.code, [hotkey string]);
}
:
結果はこう。
おお出た。
サンプル:HotKey-2.zip