halによるXのキーボード設定

/usr/local/etc/hal/fdi/policy/10-x11-kbd.fdi を次の内容で作成.

<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keyboard">
      <match key="info.udi" string="/org/freedesktop/Hal/devices/atkbd_0">
	<merge key="input.x11_options.XkbRules" type="string">xorg</merge>
        <merge key="input.x11_options.XkbModel" type="string">jp106</merge>
        <merge key="input.x11_options.XkbLayout" type="string">jp</merge>
        <merge key="input.x11_options.XkbOptions" type="string">ctrl:nocaps</merge>
      </match>
      <match key="info.udi" string="/org/freedesktop/Hal/devices/kbd_2">
        <merge key="input.x11_options.XkbRules" type="string">xorg</merge>
        <merge key="input.x11_options.XkbModel" type="string">pc101</merge>
        <merge key="input.x11_options.XkbLayout" type="string">us</merge>
<!--
        <merge key="input.x11_options.AlwaysCore" type="string">yes</merge>
-->
      </match>
    </match>
  </device>
</deviceinfo>

上のmatchの塊は, 本体のキーボードの分で, 下のmatchの塊は外付けしたときの分のつもりだけど, 外付けのは最近付けておらず, 適当に書いたのでたぶんinfo.udiの値が違う.

上のファイルを作ったら, haldをリスタートして読み込ませる. lshal(1)のたくさんの出力のうち,

udi = '/org/freedesktop/Hal/devices/atkbd_0'
  freebsd.device_file = '/dev/atkbd0'  (string)
  freebsd.driver = 'atkbd'  (string)
  freebsd.unit = 0  (0x0)  (int)
  info.capabilities = {'input', 'input.keyboard'} (string list)
  info.category = 'input.keyboard'  (string)
  info.parent = '/org/freedesktop/Hal/devices/atkbdc_0'  (string)
  info.product = 'AT Keyboard'  (string)
  info.subsystem = 'platform'  (string)
  info.udi = '/org/freedesktop/Hal/devices/atkbd_0'  (string)
  input.device = ''  (string)
  input.x11_driver = 'kbd'  (string)
  input.x11_options.XkbLayout = 'jp'  (string)
  input.x11_options.XkbModel = 'jp106'  (string)
  input.x11_options.XkbOptions = 'ctrl:nocaps'  (string)
  input.x11_options.XkbRules = 'xorg'  (string)
  platform.id = 'atkbd.0'  (string)

というようinput.x11_optionsが付いているかどうかで, halにうまく設定が渡ってるか分かる. うまくいってなかったら, fdiファイルの書き方がおかしい.

 # /usr/local/sbin/hald --daemon=no --verbose=yes

として出力を見ると, 文法エラーとかは見付かる.

X.orgにhalの設定が反映されているかどうかをチェック. Xorg.0.logを見て,

(II) Loading /usr/local/lib/xorg/modules/input//kbd_drv.so
(II) Module kbd: vendor="X.Org Foundation"
        compiled for 1.5.3, module version = 1.3.2
        Module class: X.Org XInput Driver
        ABI class: X.Org XInput driver, version 2.1
(**) AT Keyboard: always reports core events
(**) Option "Protocol" "standard"
(**) AT Keyboard: Protocol: standard
(**) Option "AutoRepeat" "500 30"
(**) Option "XkbRules" "xorg"
(**) AT Keyboard: XkbRules: "xorg"
(**) Option "XkbModel" "jp106"
(**) AT Keyboard: XkbModel: "jp106"
(**) Option "XkbLayout" "jp"
(**) AT Keyboard: XkbLayout: "jp"
(**) Option "XkbOptions" "ctrl:nocaps"
(**) AT Keyboard: XkbOptions: "ctrl:nocaps"
(**) Option "CustomKeycodes" "off"
(**) AT Keyboard: CustomKeycodes disabled
(II) XINPUT: Adding extended input device "AT Keyboard" (type: KEYBOARD)

とかなんとかなってればたぶんOK. 特に指定していないOptionも見られるが, XkbdOptionsでctrl:nocapsになってるのはたぶんデフォルトではないだろうと思うので, 反映されてるのだろう.