ShowMenu2について

既存のShowMenuと置き換えて使えるShowMenu2というのがひっそりと実装されてます。違いを簡単に言うと、これはウィンドウのフォーカスを奪いません。
特にダイアログ等では、フォーカスを失い再び得た場合にフォーカスが始めのコントロールに戻ったり、テキストの選択が変化したりといったことが起こりますが、そういったことが回避できます。
ShowMenuとShowMenu2を試しに入れ替えてみるのに一番簡単な方法は、ShowMenuをShowMenu2にsetしてしまうことです。siteinit.giraffeに、


ShowMenu@ ShowMenu2$
と一行書けば、ShowMenuにShowMenu2がsetされます。これでShowMenuとShowMenu2は同じオブジェクト(メソッドもオブジェクト)を参照するようになり、ShowMenuでShowMenu2が呼ばれます。
ウィンドウのフォーカスを変化させない以外にももうひとつ、このShowMenu2には機能があります。それは、キーボードショートカットの設定ができることです。例えば、窓使いの憂鬱Emacs風のキー設定にしていて、かつ、xyzzyは除外、というふうにしてる場合、ウインドウのフォーカスを奪わないため、xyzzyではCtrl+NでDownになってくれません。以下でShowMenu2がEmacs風キー設定になります。

ShowMenu2$.c-p: `[Keyboard.Stroke('up')]
ShowMenu2$.c-n: `[Keyboard.Stroke('down')]
ShowMenu2$.c-b: `[Keyboard.Stroke('left')]
ShowMenu2$.c-f: `[Keyboard.Stroke('right')]
ShowMenu2$.c-m: `[Keyboard.Stroke('enter')]
ShowMenu2$.c-g: `[Keyboard.Stroke('escape')]
ShowMenu2は呼び出されると、まず、自分(callee)のslotを調べ、名前をキー設定として解釈し、値をメソッドとしてShowMenu2の本体であるメニュークラスのインスタンスに登録します。calleeを使うことで関数ごとの設定を関数そのものにするということが可能になっています。