試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

X Window Systemでキーボード上の拡張キーにシンボルを割り当てて使用する

キーボード上に独自の拡張キーが存在する場合、そのままでは使えない場合が多いが、キーによっては機能割り当てを行うことで使用できる場合がある。
Compiz Fusionで「キーを機能に割り当てたいが、使えるキーがない」「未使用キーを使用して一発で機能を実行したい」といった場合にも使える。

  1. イベントを拾う
  2. キーシンボルの割り当て

イベントを拾う

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の場合で、ディストリによって場所が異なる可能性がある