SimpleCapへホットキーを追加する。
こういったツールの場合、すべての機能に一つ一つホットキーを割り当てるのが普通だが、いちいち覚えていられないのと元々ホットキーに割り当てられるキーの数が少ないので、1つだけ割り当てることにする。
具体的にはホットキーが押されたら特定の機能を実行するのではなく、SimpleCapのメニューを開く動作とする。その上で各メニューに割り当てられたキーを押す事で目的の操作をキーだけで行える様にする。
ホットキーには OPTION + COMMAND + 0 (数字の0)を割当てみた。メニュー内はよく使われる機能を数字に置き換えてみた。
利用イメージは次の様になる。
(1) OPTION + COMMAND + 0 でSimpleCapのメニューが開く
(2) '2' キーを押して範囲選択を実行
キーストロークが2回になってしまうが、覚えるホットキーは一つだけになるのはメリットだと思う。
さて実装だがホットキー自体の検証は以前済んでいでいたのでハンドリング個所の実装は既に終わっていた。
Cocoaの日々 - ホットキー
残るはキーが押された時にどうやってステータスバーのメニューを開くかだ。ADCのマニュアルを眺めているとNSStatusItem#popUpStatusItemMenu:というメソッドが見つかった。ホットキーハンドラ内でこれを呼出して見ると意図通りの動作となった。
コードはこんな感じ。
- (void)openMenu
{
[_status_item popUpStatusItemMenu:_status_menu];
}
//=========================
// Hot key handler
//=========================
OSStatus hotKeyHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData)
{
EventHotKeyID hotKeyID;
GetEventParameter(theEvent, kEventParamDirectObject, typeEventHotKeyID, NULL,
sizeof(hotKeyID), NULL, &hotKeyID);
if (hotKeyID.signature == SC_HOTKEY_SIGNATURE) {
NSLog(@"The hotkey was pressed.%@", userData);
[(AppController*)userData openMenu];
}
}
ただこの方法だとステータスバーのアイコンが選択されていない状態なので少し違和感がある。
(上の2つの画像を見比べると左側のカメラアイコンが反転していないことがわかる)
実用上問題ないのでまあいいか。