普通のキーボードとHHKを同時に使う

なぜそんなことをするのかというと。卓上の据置型キーボードはきちんと座る用、HHK Proは膝上とか(腹上とか)に置いてダラっとした姿勢用。

両方とも同じようなレイアウトなら普通にいける(Ubuntu10.04)んだけど、HHKはA横がCtrl、もう1台のキーボードはA横がCapsLock…。単純にctrl:swapcapsだとHHKのA横がCapsLockになってしまう…。

卓上キーボードはCtrlとCapsLockを入れ替え、HHKはそのままにしたい。

xorg.confで個別に設定

とりあえずこんな風にして卓上キーボードだけ設定できたものの(gdm上ではうまくいってるのが分かる)

Section "InputClass"
    Identifier "Desktop Keyboard"
    Option "XkbOptions" "ctrl:swapcaps"
    MatchDevicePath "/dev/input/event4"
EndSection

gnomeがこういうの上書きしちゃうみたいで、ログインすると2台のうちどちらかの設定に固定されてしまう。これはボツ。

xkbをいじくってsetxkbmap

このへんを参考に

hhkprocustomというmodelを追加

--- /usr/share/X11/xkb/rules/evdev.orig 2010-06-21 05:12:56.553111799 +0900
+++ /usr/share/X11/xkb/rules/evdev      2010-06-21 05:48:43.165580374 +0900
@@ -114,6 +114,7 @@

 ! model                =       keycodes
   pc98         =       evdev(pc98)
+  hhkprocustom =       evdev(hhkprocustom)
   *            =       evdev

 ! layout[1]    =       keycodes

evdevのkeycodeをいじって、CAPSとLCTLを取り替える。そして用意したHHKのほうはさらにそれを元に戻す。

--- /usr/share/X11/xkb/keycodes/evdev.orig      2010-06-21 05:52:06.697112342 +0900
+++ /usr/share/X11/xkb/keycodes/evdev   2010-06-21 06:17:42.235261204 +0900
@@ -39,7 +39,8 @@
        alias <AC12> = <BKSL>;
        <RTRN> = 36;

-       <CAPS> = 66;
+//     <CAPS> = 66;
+       <CAPS> = 37;
        <AC01> = 38;
        <AC02> = 39;
        <AC03> = 40;
@@ -66,7 +67,8 @@
        <RTSH> = 62;

        <LALT> = 64;
-       <LCTL> = 37;
+//     <LCTL> = 37;
+       <LCTL> = 66;
        <SPCE> = 65;
        <RCTL> = 105;
        <RALT> = 108;
@@ -313,3 +315,10 @@
     include "evdev(evdev)"
 };

+// HHKPro(Custom)
+xkb_keycodes "hhkprocustom" {
+    include "evdev(evdev)"
+       <CAPS> = 66;
+       <LCTL> = 37;
+};

xorg.confでMatchProductを使用してHHKのmodelをhhkprocustomに。

Section "InputClass"
    Identifier "HHKB Professional(Custom)"
    MatchProduct "Topre Corporation HHKB Professional"
    Option "XkbModel" "hhkprocustom"
EndSection

これで一見うまくいくけれども、やはりgnome上ではどちらかのレイアウトになってしまう。

それぞれのキーボードのdevice番号を見つける
setxkbmap -device 1 -layout jp

のようにして-deviceを1から順に変えて調べていき(jp配列になったのがそのキーボードの番号、という感じで)2つのキーボードの番号を調査する。
ウチでは卓上キーボードが device 8、HHK が device 12 だった。この番号が分かれば以下のようにして個別に設定ができる。

卓上キーボードをUS evdevに設定(evdevはCTRLとCaps取り替え済み)

setxkbmap -device 8 -layout us -model evdev

HHKProをUS hhkprocustomに設定(hhkprocustomはCTRLとCapsを元に戻してある)

setxkbmap -device 12 -layout us -model hhkprocustom

これを~/.xsession に書いておく。

これでやっと2つのキーボードを同時に接続して使えるようになりました。
その気になればJIS配列のキーボードとUS配列のキーボードを同時に使うとかも可能なんだなぁ(やりませんが)

HHKを普通のUSっぽい配列にしてみる

ついでにちょっとHHKのレイアウトもいじってみることになった。
xevで調べた結果。

  • エスケープ keycode 9
  • バッククオート(チルダ) keycode 49
  • バックスラッシュ keycode 51
  • デリート keycode 119

エスケープをバッククオート(チルダ)に、デリートをバックスラッシュに、バッククオートをエスケープに、バックスラッシュをデリートに。

// HHKPro(Custom)
xkb_keycodes "hhkprocustom" {
    include "evdev(evdev)"
       <CAPS> = 66;
       <LCTL> = 37;
       <TLDE> = 9;
       <BKSL> = 119;
       <ESC> = 49;
       <DELE> = 51;
};

HHKの配列も嫌いじゃないんだけど、普通のUSと混ぜて使うとやはり脳が混乱するので、同じにしたほうが気が楽なようです。