Osamu Sayama's Weblog

火曜日 9 02, 2008

Yen and underscore key on VirtualBox 1.6.4

最近気づいたのですが Laptop で使っている VirtualBox を 1.6.4 に上げたら ゲストOS で ¥ や _ キーが入力できない問題に遭遇しました。サーチしてみると他の言語のキーボードですが VirtualBox 1.6.4 broke my keyboard を発見。確かに 1.6.2 の VBoxKeyboard.so に戻すと再び入力できるようになりました。さっそくソースをみてみると 9991 の以下の変更が影響しているようです。

------------------------------------------------------------------------
r9991 | vboxsync | 2008-06-27 20:58:47 +0900 (金, 27  6月 2008) | 1 line

FE/Qt3 and 4: added a second algorithm for detecting host keyboard layout

うー む、どうもホストマシンのキーボードレイアウトの自動判別機能を改良したようだが、うまく動いていないようです。とりあえず workaround は 9990 までの VBoxKeyboard.so を使うでよさそうなので(9991 の変更は src/VBox/Frontends/VirtualBox/src/linux で閉じている)、 1.6.2 のバイナリが残っている人はそれを使ってもよいかと思います。1.6.2 は今はダウンロードできないようなので、ない人は VBoxKeyboard.so に以下のようにパッチをあてて、/opt/VirtualBox/VBoxKeyboard.so を入れ替えると使えるようになるかと思います (もちろん OSE で自分でビルドしてもいいかと思います)。

# cd /opt/VirtualBox
# cp -p  VBoxKeyboard.so VBoxKeyboard.so.org
# echo "main_keyboard_type_scans+0x214?W 7d\nmain_keyboard_type_scans+0x34c?W 73" | mdb -w VBoxKeyboard.so

以下は、SunRay 環境だと再現しないのでなぜかと思って調べてみたことを書いておきます。

X11 の keycode/keysym から guest 用の scan code を発生する機能が必要で keycode/keysym は Xserver のタイプ (Xorg/Xsun) やキーボードレイアウトによって意味が異なるので、scan code を生成するにはそれぞれの場合分けで生成が必要である。でこの処理を VBoxKeyboard.so でやっていて 9991 で Xorg のほうは新たな方法に変えたのだが、keycode -> scan code 変換テーブルが今のとこ英語101キーボードの範囲しか定義されていないようである。ので日本語106キーボード固有のキーは使えないようになってしまった(どうももとから、無変換、変換キーは使えなかたったようですが、あまり使われないので問題にならなかったようだ)。SunRay は Xsun を使うのでこの問題がおきなかったようです。keyboard-new.c の X11DRV_KeyEvent() がそうで、dtrace でここを調べると (10752 は VirtualBox で quest 本体のプロセス)

# dtrace -n 'pid10752::X11DRV_KeyEvent:entry {printf("KeyCode=%x(%d)\n", arg0, arg0);} pid10752::X11DRV_KeyEvent:return {printf("ret=%x(%d)\n", arg1, arg1);}'

該当するキーを guest os の中で押すと 0 が返ってくるのがわかります。上記 mdb であてるパッチはとりあえずここで使われている main_keyboard_type_scans table の  Standard PC keyboard のほうにパッチをあてるものです。¥キーの X keycode は Xorg on Solaris, Xorg on Ubuntu ともの 133 , _ (underscore) のほうは 211 なのでこれらの AT scan code を書いてあげればよい。このテーブルは unsigned int の配列なので 133(=0x85) x 4 = 0x214 に 7d を書けばよい、同様に 0x34c に 73 を書けばよく上記の mdb コマンドになります。ちなみにこの問題は VirtualBox バイナリのフロントエンドの問題で VBoxSDL で起動したときはおきなかったりします。いちおうパッチを作ったので Linux も試してからバグレポートでも書こうかなと思ってます。しかしこの Xorg on Solaris のキーコードの違いも早く直さないと..

投稿されたコメント:

コメント
  • HTML文法 不許可

Calendar

Feeds

Search

Links

Navigation

Referrers