Bluetooth キーボードのためにまたCapsLockを消し去ったり

今まではcapslock殺しはxmodmapに任せていて、それで不満とかなかった。
しかし、bluetooth キーボードが混沌を運んできた。Amazon二千円で。

接続が切れるたびに(再接続になるたびに)xmodmapされる前の状態に戻る!!!
発狂しかけたので設定方法を調べました。

CapsLock

xkbで設定しろよ。ってことがわかった。
それでこれをどこで設定するかという話になるのだけれど、色々なところで書けるみたいでどれが一番スマートか分かりかねました。

capslockを殺すだけなら /usr/share/X11/xorg.conf.d/10-evdev.conf なりのevdevの設定で

Section "InputClass"
        Identifier "evdev keyboard catchall"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
        Option "XkbLayout" "us"
        Option "XkbOptions" "ctrl:nocaps"
EndSection

するのが手っ取り早そう。

ついでにリマッピング

最近出回っているbluetoothキーボードは、Escがなかったりしますので更にリマップしたくなるでしょう。私の場合は、EscがXF86HomePageとかが割り当たってたのでリマップします。私の場合、どうせ使わないので潰す方向でいきます。

Debian 6 squeeze のキーマップ設定 (One Foot) でxkbの適用順番が解説されています。

まず、xevでキーコードを調べる。xevでキーコードが取れない場合はHow to get keycodes for xmodmap?を見るとよろしい。

KeyRelease event, serial 32, synthetic NO, window 0x1a00001,
    root 0x9d, subw 0x0, time 1509250, (-532,286), root:(623,829),
    state 0x0, keycode 180 (keysym 0xff1b, XF86HomePage), same_screen YES,
    XKeysymToKeycode returns keycode: 9
    XLookupString gives 1 bytes: (1b) ""
    XFilterEvent returns: False

keycode 180
次に、setxkbmap -print -vして適応されているルールを調べる。

keycodes:   evdev+aliases(qwerty)
types:      complete
compat:     complete
symbols:    pc+us+inet(evdev)+ctrl(nocaps)
geometry:   pc(pc104)
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)"  };
    xkb_types     { include "complete"   };
    xkb_compat    { include "complete"   };
    xkb_symbols   { include "pc+us+inet(evdev)+ctrl(nocaps)" };
    xkb_geometry  { include "pc(pc104)"  };
};
  1. X11/xkb/keycodes/evdev
  2. X11/xkb/keycodes/aliasesqwertyセクション

の順で適用さている。 キーコード180は、X11/xkb/keycodes/evdev

    <I180> = 180;   // #define KEY_HOMEPAGE            172

<I180>に割り当てられているので、今度は<I180>を追う。(ちなみにここで、<ESC> = 180とすると、元々のEscapeキーであるkeycode 9がどこにも割り当てられてない状態になってしまう。)

今度は、X11/xkb/symbols/以下で<I180>が適応されている部分を探す。 さっきのsetxkbmap -print -vをみてみる。

  1. X11/xkb/symbols/pc
  2. X11/xkb/symbols/us
  3. X11/xkb/symbols/inetのevdevセクション
  4. X11/xorg.conf.d/10-evdev.confで指定したctrl:nocpas

の順で適用さているのがわかる。ここで- 日本語キーボードを英語配列風にする (@tmtms のメモ)の方法でリマップしても<I180>はX11/xkb/symbols/inetで割り当てられているのでダメダ。

考えられた方法は、

  1. X11/xkb/symbols/inetを呼び出さないようにルールを書き換える。そうすれば、もカスタマイズしたように動くので、そのカスタマイズしたsymbolsをX11/xorg.conf.d/10-evdevのXkbLayoutで指定する。
  2. X11/xkb/symbols/inetを直接書き換える。

1番の場合、どのルールが適用されているか調べる必要があるのだけれど、私のX は、--with_default_xkb_rules=evdev を指定してビルドされてるので、X11/xkb/rules/evdevを書き換えればいい。…のだけれどあんまり書き換えたくない。

2番の場合、…もあんまり書き換えたくない。

…結局は、2番で。うーん。

あとはxkbの設定についてArch Wiki とか見ればいいのだと思う。 X KeyBoard extension(Arch Wiki)

理想としては再接続かかるたびにxmodmap走らせたいよねー。ユーザーごとに設定したいよねー。xmodmapは指定の仕方によってはトグル操作になって嬉しくないのかも知れないけど、キーコードに直接割り当てるだけなら大丈夫そう。これはまたそのうちできたらできたで…。

その方法がわかるまでにストレスで死にそうなので、今はこうしてるってメモでした。 もっといい方法知りたい。