2010年5月11日火曜日

Linux(CentOS)にてAX keyboardからのかな入力

Linux(CentOS 5.4)にてAX keyboardを利用する方法について記載します。

1. はじめに
目標は以下の通りです。
  • X windows systemにてSCIMによる仮名入力が可能となること。
  • かな配列はAX keyboardに刻印されたものであること。
  • SCIM/AnthyのON/OFFは『無変換』キーにて行う。
  • 変換は『変換』キーにて行う。

※1: 『AX』キーは利用しない。
※2: AX keyboardはPS/2 Interface接続。
※3: 以下『』ではキー自体を示します。「」はキーによって発生する文字(コード)を示します。

環境は以下の通りです。
  • M/B: Gigabyte GA-MA69SM-S2H, CPU: AMD X2 BE-2400, 6GB Memory
  • Linux: CentOS 5.4 (Kernel 2.6.18-164.15.1.el5 x86_64)
  • X windows system: 7.1.1 x86_64
  • AX keyboard: FKB8520-501


 Fig-1. AX keyboard








設定の概要は下記の通りです。

(1) Kernel AT keyboard driverに対して、AX keyboardの『無変換』、『変換』キーを押したときにOADG 106 keyboardの『無変換』、『変換』キーと同じkeycodeを発生させます。setkeycodesコマンドにて行います。Keyboardの定義は AT "us" のままとします。

(2) X11 windows systemにて、 『無変換』、『変換』のキーが押されたときに、それぞれ「Muhenkan」と「Henkan」のkeycodeを発生されるようにします。これは $HOME/.Xmodmapに記載します。

(3) SCIM/Anthyにて、かな入力のカスタマイズ定義をします。SCIM/Anthyは、かな入力のときに押された英数字キーをかなにマッピングしてい ますが、そのマッピングがOADG 106 keyboard用になっているため、AX keyboard用の配列にします。
 
(4) 『ろ』のキーが押されたときにdefaultのままでは、"<"が発生されるようになっており、かな入力の際に読点「、」が表示されます。そこで『ろ』キーを押したときに「|」を発生させます。『ろ』キーの表記通り「\」を発生させると『Back Space』左横の『¥』キーの音引き「ー」とかち合います。SCIM/Anthyの定義で「|」に対して、"ろ"のマッピングをします。


2. 設定手順
設定の手順としては以下のようになります。
2-1. Linux consoleにて、『無変換』、『変換』キーのscan codeがOADG 106 keyboardの『無変換』、『変換』キーと同じkeycode(94, 92)を発生させます。


(1) X windowsから、端末を開きます。su - にてsuper userとなり、init 4を実行して、consoleに戻ります。

(2) consoleからrootにてログインし、showkeyを実行します。
『無変換』、『変換』キーを押したときに下記のconsole messageが表示されることを確認します。
Linux consoleから『無変換』キーを押したときに表示されるmessage
atkbd.c: Unknown key pressed (translated set 2, code 0x5a on isa0060/serio0).
atkbd.c: Use 'setkeycodes 5a ' to make it known
atkbd.c: Unknown key released (translated set 2, cod 0x5a on isa0060/serio0).
atkbd.c: Use 'setkeycodes 5a ' to make it known.

Linux consoleから『変換』キーを押したときに表示されるmessage

atkbd.c: Unknown key pressed (translated set 2, code 0x5b on isa0060/serio0).
atkbd.c: Use 'setkeycodes 5a ' to make it known
atkbd.c: Unknown key released (translated set 2, cod 0x5b on isa0060/serio0).
atkbd.c: Use 'setkeycodes 5a ' to make it known.

10秒間入力がなければ、showkeyは勝手に終了します。

(3) setkeycodeコマンドにて scan code - keycodeの割り当てを行い、『無変換』、『変換』キーを押したときに想定したkeycodeが発生することを確認します。
[root]# setkeycodes 5a 94
[root]# setkeycodes 5b 92
[root]# showkey

/etc /rc.localに上記のsekeycodesを追加して、システム再起動を行い、起動時に設定されることを確認します。

[root]# cat /etc/rc.local
---------------
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

setkeycodes 5a 94
setkeycodes 5b 92
---------------

設定が完了すると init 4でconsoletからshowkeyを実行したときに以下のようになります。
[root ]# showkey
---
keycode 94 press
keycode 94 release
keycode 92 press
keycode 92 release
---

init 5でX windows systemに戻ります。


2-2.xmodmapによるX windows systemでのキー定義
X windows systemに『無変換』、『変換』キーを認識させるために$HOME/.Xmodmapを以下のように記述します。keycodeとkeysymの対応づけをするものです。keycode 94は、『ろ』キーで、「|」とshiftで「\」を発生させるためのものです。
[user]$ cat .Xmodmap
keycode  94 = bar backslash
keycode 129 = Henkan
keycode 131 = Muhenkan
remove mod5 = ISO_Level3_Shift
keycode 113 = Alt_R

gnomeの起動時に .Xmodmapを読み込むかどうか聞いてくるので読み込ませるように設定します。

2010/05/15: 追記
CentOSの新規インストール状態では、右Alt(AX『漢字』)キーは、ISO_Level3_Shiftに定義されているようです。これを外して、Alt_Rに定義し直しました。右Altも左Altも本来のAltとしてメニュー選択などに利用していますので、このような設定にしました。


2-3. X windows systemを起動し、SCIM/Anthyの設定変更を行います。
(1) ホットキーの開始/終了に Muhenkan を追加。Fig-2~Fig-6
(2) Anthy キーバインドの変換に Henkan を追加。Fig-7~Fig-12
(3) 仮名入力のレイアウトをユーザー定義として、カスタマイズを実施する。Fig-13
    カスタマイズの結果は $HOME/.scim/Anthy/config.styに保存される。直接編集でも対応できる。Appendix-1に掲載。

ここまでできる と、IMに対応したGUI applicationにて漢字入力ができるようになります。
  • ブラウザの起動後、ボックスなどのテキスト入力にfocusしたとこ、で『無変換』キーを押すと SCIM/Anthyのツールバーが表示されます。もう一度『無変換』キーを押すとツールバーは隠れます。
  • ツールバーが表示された状態で、かな入力ができます。『変換』キーを押すと仮名漢字変換されます。
  • ツールバーが表示された状態でも 左ALT, 右ALT(『漢字』キー), 左CTRL, 右CTRL(『英数/カナ』キー)は有効です。


Fig-2. SCIM/Anthy tool bar
右から2場面のプロパティアイコンをクリック


Fig-3. SCIM 開始/終了キー設定
左のペインにてフロントエンジン-全体設定
ホットキーグループの開始/終了列で右端の
ボタンをクリック





Fig-4. 設定画面
キーコード列の右端のボタンをクリック 








Fig-5. キー登録
『無変換』キーを押す



Fig-6. キー登録
追加ボタンクリックで完了






Fig-7. 『変換』キーの設定
IMエンジン-Anthyを選択
キーパインドタブを選択






Fig-8. キーバインドタブ画面







Fig-9 キー設定
キーを設定ボタンをクリック







Fig-10. 設定画面
キーコード列の右端のボタンをクリック










Fig-11.キー登録
『変換』キーを押す






Fig-12. キー登録
追加ボタンをクリック



































Fig-13. マッピング
かな入力タブ-レイアウト列のカスタマイズボタン
@ (shift+2)を押したときに「ふ」が表示されるようにマッピング済み。










4. 事前調査について
X windows system上でのAX keyboardによるかな入力について簡単に調査したところ、以下のことがわかったために、今回の設定方法にしたものです。

4-1. X windows system上のSCIM/Anthy入力は、かな入力のときには、キー入力により発生したASCIIコードに対応した「かな・かな記号」へのマッピング テーブルを持っているようです。そのマッピングテーブルはOADG 106 keyboardのASCII配列を想定しており、AX keyboardでかな入力をすると一部キーの刻印と表示される文字が異なる現象が発生してしまいます。それゆえ、そのマッピングをAX keyboard用に変更でき、かつSCIM/Anthyでのかな入力に限定するならば、X windows systemでのxkbシステムにて/usr/share/X11/xkb以下にax105用のkeyboard情報を作成して、きちんとかな文字を発生させる必要もないと思われました。

4-2. X windows systemでのOADG 106 keyboard用の『無変換』、『変換』キーの割り当ては、
hw/xfree86/common/xf86Keymap.h
--------------------
static KeySym map[NUM_KEYCODES * GLYPHS_PER_KEY] = {

#ifdef HAVE_XORG_CONFIG_H
#include
#endif

#if !defined(__SOL8__) && (!defined(sun) || defined(i386))

    /* 0x00 */  NoSymbol,       NoSymbol,       NoSymbol,       NoSymbol,
    /* 0x01 */  XK_Escape,      NoSymbol,       NoSymbol,       NoSymbol,
---

    /* 0x79 */  XK_Henkan,      XK_Mode_switch, NoSymbol,       NoSymbol,
    /* 0x7a */  NoSymbol,       NoSymbol,       NoSymbol,       NoSymbol,
    /* 0x7b */  XK_Muhenkan,    NoSymbol,       NoSymbol,       NoSymbol,
--------------------
と定義されています。すなわち、OADG 106 keyboardにて、
(1) 『無変換』が押された。scancode: 0x7b / Linux kernel AT keyboard driver
(2) 0x7bをXK_Henkanのkeysym (0xff23)に変換。/ X11 Server
(3) XK_Henkanのkeysym (0xff23)を keycode 131に変換 / X11 Server, xkb
の順で処理されているものと推測されます。

xf86Keymap.hにて、AX keyboardの『無変換』キー(scancode 0x5a)と『変換』キー(scan code 0x5b)は以下のような定義になっています。
    /* 0x5a */  XK_Up,          NoSymbol,       NoSymbol,       NoSymbol,
    /* 0x5b */  XK_Prior,       NoSymbol,       NoSymbol,       NoSymbol,

X11の keysymの定義は /usr/include/X11/keysymdef.h。

/* Japanese keyboard support */

#define XK_Kanji                         0xff21  /* Kanji, Kanji convert */
#define XK_Muhenkan                      0xff22  /* Cancel Conversion */
#define XK_Henkan_Mode                   0xff23  /* Start/Stop Conversion */
#define XK_Henkan                        0xff23  /* Alias for Henkan_Mode */


4-3. Linux Kernel AT keyboard driverでは、AT keyboardのscancode set 2を指定しているように見えます。

4-4. Keyboardからのscan codeは、atkbd_set2_keycode tableにて発生させるキーの制御をしている。AX keyboardの『無変換』、『変換』キーのscancodeに対して発生させるキーは '0' となっており、それらのキーは押しても無視されているようです。ただし、AT keyboard driverは、それぞれのキーのpress(make), release(break)でAT keyboardが変換テーブルで未割当である旨のmessageをAT keyboard driverが表示しているようです。





Appendex-1 SCIM/Anthy config file (key mapping)

[user]$ cat $HOME/.scim/Anthy/config.sty

Encoding=UTF-8
Title=User\ defined

[KanaTable/FundamentalTable]
1=ぬ
2=,ふ
3=あ
4=う
5=え
6=お
7=や
8=ゆ
9=よ
0=わ
-=,ほ
^=ぉ
q=,た
w=,て
e=い
r=,す
t=,か
y=ん
u=な
i=に
o=ら
p=,せ
@=,ふ
\[=゛
a=,ち
s=,と
d=,し
f=,は
g=,き
h=,く
j=ま
k=の
l=り
;=れ
:=れ
\]=゜
z=,つ
x=,さ
c=,そ
v=,ひ
b=,こ
n=み
m=も
\,=ね
.=る
/=め
\\=ー
!=ぬ
"=,け
\#=ぁ
$=ぅ
%=ぇ
&=ゃ
'=,け
(=ょ
)=を
~=」
\==,へ
|=ろ
Q=,た
W=,て
E=ぃ
R=,す
T=ヵ
Y=ん
U=な
I=に
O=ら
P=,せ
`=む
A=,ち
S=,と
D=,し
F=ゎ
G=,き
H=,く
J=ま
K=の
L=り
+=,へ
*=ゅ
Z=っ
X=,さ
C=,そ
V=,ゐ
B=,こ
M=も
N=み
_=,ほ
}=「



Appendix-2. xorg.conf

/etc/X11/xorg.confを記載します。

Section "ServerLayout"
        Identifier     "single head configuration"
        Screen      0  "aticonfig-Screen[0]-0" 0 0
        InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
EndSection

Section "ServerFlags"
        Option      "Xinerama" "off"
EndSection

Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
        Option      "XkbModel" "pc105"
        Option      "XkbLayout" "us"
EndSection


Section "Monitor"

 ### Comment all HorizSync and VertSync values to use DDC:
        Identifier   "aticonfig-Monitor[0]-0"
        ModelName    "Mitsubishi TFT Monitor RDT150S"
        HorizSync    24.8 - 63.0
        VertRefresh  30.0 - 85.1
        Option      "VendorName" "ATI Proprietary Driver"
        Option      "ModelName" "Generic Autodetecting Monitor"
        Option      "DPMS" "true"
EndSection

Section "Device"
        Identifier  "aticonfig-Device[0]-0"
        Driver      "fglrx"
        BusID       "PCI:1:5:0"
EndSection

Section "Screen"
        Identifier "aticonfig-Screen[0]-0"
        Device     "aticonfig-Device[0]-0"
        Monitor    "aticonfig-Monitor[0]-0"
        DefaultDepth     24
        SubSection "Display"
                Viewport   0 0
                Depth     24
                Modes    "1024x768" "800x600" "640x480"
        EndSubSection
EndSection


その他
AX keyboardをPS/2→USB変換機経由で接続したときにはAT keyboardとなり、『無変換』、『変換』キーは有効にならない。これはどうしようもないのか時間ができたら調査したい。
疑問点は以下の通り。
  • USB keyboard driverは、scan code set 2にしているのか。AX keyboardはscan code set 2にしないと、『無変換』、『変換』などの固有キーが有効にならないような記憶がある。
  • OADG 106 keyboardは、固有のキーが有効となるが、これはなぜか?
  • AX keyboardをUSB接続するときは、PS/2→USB変換機が必要となるが、変換機がscan code set 2への変換とキーマッピングを行っているのか。

きちんとかなコードを発生させるためにはxkb データベース (/usr/share/X11/xkb)にAX keyboardの情報を登録する必要があるようだ。


参考資料
https://wiki.ubuntu.com/handrake
http://www.asahi-net.or.jp/~WR7S-NKMR/MiddleWare/keyboard/ax.htm
http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html

history
2010/5/9: Draft version
2010/5/11: Initial release
2010/5/15: Update .Xmodmap, added xorg.conf in Appendex-2

0 件のコメント:

コメントを投稿