ページ

2009年7月11日土曜日

ホットキー変更対応(24) - キー設定の変更をシステムへ反映する

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

前々回まででホットキー設定 UIのひな形ができたが、変更してもシステムへは反映していなかった。今回はその実装を行う。

まず HotkeyTextView で変更があったことをコントローラへ通知する必要がある。今回は自前のターゲット/アクションを用意しよう。

まず HotkeyTextViewへ target と action プロパティを用意する。

HotkeyTextView.h

@interface HotkeyTextView : NSTextView {
:
id _target;
SEL _action;
}
:
@property (retain) id target;
@property (retain) SEL action;

@end



次にホットキーが変更された場合に target に対して action メソッドを呼び出す処理を用意する。これは keyDown: の中がいいだろう。

HotkeyTextView.m
- (void)keyDown:(NSEvent *)theEvent
{
:
// 確定処理
if (_hotkey.modifier != modifier || _hotkey.code == keycode) {
_hotkey.modifier = modifier;
_hotkey.code = keycode;

if (self.target && [self.target respondsToSelector:self.action]) {
[self.target performSelector:self.action withObject:self.hotkey];
}
}

[self redraw];
[self endEdit];
}

前回は同じキーが押された場合の処理が抜けていたのでついでに加えておいた(実際にはホットキーが起動するため、イベントはとれないのだが)。
必要な情報を Hotkey へ格納した後、target / action の存在チェックを行い、メッセージを投げる。引数として Hotkeyを渡しておく。


一方、使う側はこんな感じ。
AppController.m
- (void)awakeFromNib
{
_hotkey_register = [HotkeyRegister sharedRegister];

Hotkey *hotkey;

hotkey = [[[Hotkey alloc] init] autorelease];
:
_text1.hotkey = hotkey;
_text1.target = self; <--追加
_text1.action = @selector(changeHotkey:); <--追加
:


変更時に呼び出される changeHotkey: でシステムへの反映を行う。

- (void)changeHotkey:(id)sender
{
NSLog(@"changeHotkey was called: %@", sender);
[_hotkey_register registHotkey:sender];
}


- [HotkeyRegister registHotkey] は直前のホットキーを取り消した(unregist)後に、新しいキーを登録するように実装してある。

さて実行してみよう。デバッグコンソールで動作を追って見る。
「⌥⌘P」を「⌃⌥⌘⇧Space」へ変更してみよう。

[Session started at 2009-07-11 06:10:45:24 +0900.]
:
2009-07-11 06:10:34.376 Hotkey[1062:10b] changeHotkey was called: <Hotkey: 0x1559a0>
↑ホットキーを変更すると changeHotkey: が呼び出された。
2009-07-11 06:10:34.416 Hotkey[1062:10b] unregistHotkey: <Hotkey: 0x1559a0>
 ↑直前のキーが取り消され
2009-07-11 06:10:34.434 Hotkey[1062:10b] registHotkey: keyid=2, modifier=1b00, code=31, ref=1aefe0,
target=<AppController: 0x151730>, action=keyDown:
 ↑新しいキーが登録された
2009-07-11 06:10:34.464 Hotkey[1062:10b] {(
<Hotkey: 0x155760>,
<Hotkey: 0x1559a0>
)}
2009-07-11 06:10:38.954 Hotkey[1062:10b] keyDown: keycode=31 [⌃⌥⌘⇧Space]
 ↑試しに新しいホットキーを押すとちゃんと反応した。
2009-07-11 06:10:44.979 Hotkey[1062:10b] keyDown: keycode=25 [⌥⌘L]




サンプル:HotKey-4.zip