ページ

2009年6月16日火曜日

ホットキー変更対応(5) - 修飾キーを表示する

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

入力は後回しにして先に表示を片付けよう。

まずは表示確認用に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) では無い。変換する必要があるな。