TenForward

技術ブログ。はてなダイアリーから移転しました

Plamo-5.0 での X のキーボード設定

Plamo-5.0 を開発中で,とりあえず日常のお仕事がこなせる程度にはパッケージもそろってきました.が,X を起動するとキーボードが日本語配列にならない.Why?? ということで調べてみました.

Plamo-5.0 は X.Org 7.6 なのかな? xserver は 1.9 になっています.

原因

X.org 7.4 辺りから入力デバイスの設定は xorg.conf を使わないようになってきているようです.7.4 の時点では hal を使うようになっていて,/etc/hal/fdi/policy に設定ファイルを置くことにより,キーボードの設定を行うようになっていました (メンドくせー).

が,X.org 7.6 (xserver 1.8 の頃から?) になると,今度は hal すら使わないようになるようです.udev, xorg.conf.d, xorg.conf という順番で設定されるようで,若干逆戻りした風に?

また,入力デバイスは "evdev" というドライバを使うようになっているようです.

xfplamoconfig で作った xorg.conf を使う

X.org 7.4 辺りから入力デバイスの設定は xorg.conf を使わないようになってきているようです.これを使うようにするには xfplamoconfig で xorg.conf を作っておいて "ServerLayout" セクションに "AllowEmptyInput" という設定を行うと良いようです.

まず xfplamoconfig で xorg.conf を生成しておいて,

Section "ServerLayout"
        Identifier     "Layout0"
        Screen         0  "Screen0" 0 0
        InputDevice    "Keyboard0" "CoreKeyboard"
        InputDevice    "Mouse0" "CorePointer"
        Option         "AllowEmptyInput" "off"
EndSection

あと Plamo-5.0 の xfplamoconfig ではコメントアウトされている

Section "ServerFlags"
        Option "AutoAddDevices" "false"
EndSection

を有効にします."AllowEmptyInput" の設定を行わないまま,"AutoAddDevices" を有効にするとキーボードききません.^^;

(あと,現時点だと xfplamoconfig で作るとディスプレイドライバが vesa になるような気がするので,そこを適切なものに変える必要があるかな?)

xfplamoconfig は使わない.

最近の X では,xorg.conf がなくてもそこそこ自動的にデバイスを認識して起動するようになっています.が,キーボードの認識には失敗しているので,このような事が起きるわけです.

現在のキーボードの認識は /usr/share/X11/xorg.conf.d/10-evdev.conf の記述が効いているような気がします.10-evdev.conf の内容は以下のような感じ.

Section "InputClass"
        Identifier "evdev keyboard catchall"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection

これを上書きするような設定をやれば OK です.考えられるのは

  • /usr/share/X11/xorg.conf.d で 10-evdev.conf より後に読み込まれるファイルに設定
  • /etc/X11/xorg.confに設定

ですかね.とりあえず /etc/X11/xorg.conf

Section "InputClass"
        Identifier "evdev keyboard catchall"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
        Option "XkbLayout" "jp"
EndSection

とすれば良いようです.

おまけ

前述のように,キーボード(や他の入力デバイス)の認識が 10-evdev.conf の記述にしたがって行われるようですが,この識別がもう一つ? 手元の PC では,なんか電源ボタンとかをキーボードとおっしゃってますけど... (他にも VideoPort がキーボードとか色々...)

[  3789.319] (II) XINPUT: Adding extended input device "Power Button" (type: KEYBOARD)
[  3789.319] (**) Option "xkb_rules" "evdev"
[  3789.319] (**) Option "xkb_model" "evdev"
[  3789.319] (**) Option "xkb_layout" "us"

この "MatchIsKeyboard" の設定がうまくいかないから,前述のような変なものがキーボードに? 多分,実際の設定は,本当のキーボードに対してキーボードレイアウトが "jp" だ,と言えばいいような気がします.例えば,

Section "InputClass"
        Identifier "Plamo Keyboard Setting"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event6"
        Driver "evdev"
        Options "XkbLayout" "jp"
EndSection

でも,これでキーボードを jp 配列にしても,他のキーボードが検出されたときに,そっちが en 配列になってしまうから,結局最終的に en で起動してくるのかな? Xorg.0.log を見ると

# grep xkb_layout /var/log/Xorg.0.log
[  4682.596] (**) Option "xkb_layout" "us"
[  4682.622] (**) Option "xkb_layout" "us"
[  4682.639] (**) Option "xkb_layout" "us"
[  4682.659] (**) Option "xkb_layout" "jp"
[  4682.699] (**) Option "xkb_layout" "us"

最後に認識されるキーボードが手元のマシンだと,Xorg.0.log を見ると

[  4682.688] (II) config/udev: Adding input device HP WMI hotkeys (/dev/input/ev
ent3)
[  4682.688] (**) HP WMI hotkeys: Applying InputClass "evdev keyboard catchall"
[  4682.688] (**) HP WMI hotkeys: always reports core events
[  4682.688] (**) HP WMI hotkeys: Device: "/dev/input/event3"
[  4682.699] (--) HP WMI hotkeys: Found keys
[  4682.699] (II) HP WMI hotkeys: Configuring as keyboard
[  4682.699] (II) XINPUT: Adding extended input device "HP WMI hotkeys" (type: K
EYBOARD)
[  4682.699] (**) Option "xkb_rules" "evdev"
[  4682.699] (**) Option "xkb_model" "evdev"
[  4682.699] (**) Option "xkb_layout" "us"

ということで /dev/input/event3 みたいなので,

Section "InputClass"
        Identifier "Plamo Keybord"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event3"
        Driver "evdev"
        Option "XkbLayout" "jp"
EndSection

こんな設定を書いてみたら,無事 jp 配列になりましたとさ... お粗末... (>_<)

(参考) Ubuntu 10.10 では?

こんな感じみたい.

  1. /etc/default/console-setup 内にこんな記述が.
    XKBMODEL="pc105"
    XKBLAYOUT="jp"
    XKBVARIANT=""
    XKBOPTIONS=""
  2. udevの設定ファイル /lib/udev/rules.d/64-xorg-xkb.rules 内で
    ENV{ID_INPUT_KEY}=="?*", IMPORT{program}="/bin/grep ^XKB /etc/default/console-setup"
    こんな一行が.