入力は後回しにして先に表示を片付けよう。
まずは表示確認用にcommand+option+0 を表す値を NSUserDefaultsへ固定で入れておく。これが画面上 command option 0 (それぞれ記号)で表示されれば良い。
表示確認用の値は - [AppController awakeFromNib]で設定する。
AppController.m
- (void)awakeFromNib
{
UInt32 modifier = optionKey | cmdKey;
UInt32 key = 29; //'0'
UInt32 hotkey = (modifier << 16) | key;
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithUnsignedInt:hotkey] forKey:@"hotkey"];
}
NSUserDefaults には Unsinged Int 32ビットで格納し、上位 16ビットを修飾キーに、下位 16ビットを通常キーに割り当てる。
実行すると10進数値が表示される(※16進数値では 0x9000001d)。
次はこの値から修飾キー表示用の文字列を作成する。前回用意した [HotkeyFormatter stringForObjectValue:] にこの処理を書く。
HotkeyFormatter.m
- (NSString *)stringForObjectValue:(id)anObject
{
NSString* key_desc = @"";
if (anObject && [anObject isKindOfClass:[NSNumber class]]) {
UInt32 value = [anObject unsignedIntValue];
UInt32 modifier = value >> 16;
UInt32 key = value & 0xff;
NSLog(@"mod=%x", modifier);
NSLog(@"key=%x", key);
if (modifier & controlKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kControlUnicode];
}
if (modifier & optionKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kOptionUnicode];
}
if (modifier & cmdKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kCommandUnicode];
}
if (modifier & shiftKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kShiftUnicode];
}
}
return key_desc;
}
実行してみよう。
出た。
- - - -
修飾キーは表示できたので、後は実際のキー(今回は '0')を表示するのだが、これを表示するにはどうしたら良いのだろうか。キーボードの'0'を表す 29 (0x1d)は '0'のキャラクターコード 48 (0x30) では無い。変換する必要があるな。