X Window Systemでキーボード上の拡張キーにシンボルを割り当てて使用する
キーボード上に独自の拡張キーが存在する場合、そのままでは使えない場合が多いが、キーによっては機能割り当てを行うことで使用できる場合がある。
Compiz Fusionで「キーを機能に割り当てたいが、使えるキーがない」「未使用キーを使用して一発で機能を実行したい」といった場合にも使える。
イベントを拾う
xevというコマンド(同名のパッケージになっている)を実行すると、Xサーバ上の各種イベントが拾える。実行すると小さなウィンドウが開いてフォーカスされ、ここでキーボードから入力したものがXサーバに伝わっていれば、キーを押したときと離したときに情報が表示される。ただし、別のイベント*1が起きるとすぐに流れてしまうので注意。情報を確実に残したいのなら、
$ (sleep 10 && killall xev) &; xev
上のように、時限killallで指定時間後にxevを自動終了するようにしてからキーを押す。
下のような情報(KeyPress/KeyRelease)が見つけられれば認識されていることになる。
KeyPress event, serial 31, synthetic NO, window 0x2400001, root 0x1a5, subw 0x0, time 118985856, (165,-15), root:(312,330), state 0x10, keycode 164 (keysym 0x0, NoSymbol), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False KeyRelease event, serial 31, synthetic NO, window 0x2400001, root 0x1a5, subw 0x0, time 118985872, (165,-15), root:(312,330), state 0x10, keycode 164 (keysym 0x0, NoSymbol), same_screen YES, XLookupString gives 0 bytes: XFilterEvent returns: False
キーを押しても何も出ない場合は認識自体がされていないため、以下の方法でキーを使用することはできない。
キーシンボルの割り当て
X Window System上では、キーはその番号(keycode)でなく、番号に対応したシンボル名(keysym)を通して扱うことが一般的。例えば、「ー」のキーと「ろ」のキーのkeycodeはそれぞれ133と211*2だが、どちらもシンボル名は「keysym 0x5c, backslash」でバックスラッシュが出る。もし、上のようにキーを押したときに反応があり、「NoSymbol」になっているのであれば、表示されているkeycode(上の例では「164」)を使用してxmodmapコマンドでキーを割り当てる設定を読み込ませることで、keysymを割り当てることができる。
手元のキーボードは、以前使用していたメーカ製マシンに付属していたものなのだが、12個ある拡張ボタンの内、7つはxevで反応があり、キーの割り当てができるようになっていた。指定書式の例として、設定を貼り付けてみる。
ファイル名: ~/.Xmodmap
keycode 164 = F21 keycode 162 = F22 keycode 144 = F23 keycode 153 = F24 keycode 174 = F25 keycode 166 = F26 keycode 223 = F31
最も手っ取り早いのはファンクションキーとして使用することだが、/usr/share/X11/xkb/symbols/jp*3を参考にしてシンボル名を記述することで、その他のキーとして使用することもできる。/usr/include/X11/keysymdef.hも参照。
このファイルはデスクトップ環境によっては自動でxmodmapコマンドにより処理されることもあるが、手動で
$ xmodmap ~/.Xmodmap
を実行することで設定反映することもできる。
xmodmap実行後、xevを再び実行して試すと
KeyPress event, serial 31, synthetic NO, window 0x2400001, root 0x1a5, subw 0x0, time 123122246, (415,681), root:(422,707), state 0x10, keycode 164 (keysym 0xffd2, F21), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False KeyRelease event, serial 31, synthetic NO, window 0x2400001, root 0x1a5, subw 0x0, time 123122249, (415,681), root:(422,707), state 0x10, keycode 164 (keysym 0xffd2, F21), same_screen YES, XLookupString gives 0 bytes: XFilterEvent returns: False
このように、キーシンボルが割り当てられたことが確認できる。
*1:ウィンドウにマウスポインタを出し入れするだけでも、端末上のメッセージが一気に流れてしまう
*2:環境によっては値が異なるかもしれない
*3:これはGentoo Linuxの場合で、ディストリによって場所が異なる可能性がある