川口です

特定機種のハードウェアの問題っぽい話ですが,
キーボードが変だという話です

● 利用環境
機種は HP ML110 G6 (core i3版),PS/2ポートに mouse/keyboardを挿しています
(但し実際には搭載されている ServerEngines の仕様で,内部的には 
USB keyboard/mouse に変換されているので,OSからは USB kb/mouse に見えています).
FreeBSD 8-stable/amd64, Xorg7.5を hald/dbus で動かしている状態です.

格安で出回っているので買ってみた方も多いのではないかと.
http://h10010.www1.hp.com/wwpc/jp/ja/sm/WF06b/15351-15351-241434-3328424-3328424-3984625-4125040.html

● 問題の挙動
コンソールでXorg起動し,キーボードで物書きなどを
していると結構フラストレーションがたまります.

挙動は,一見正常に動作しているように見える.
しかしctrl,shift などのモディファイヤに問題挙動あり:
 * ctrl + l などは単発では正常
 * ctrl キーを押しっ放しで連続でキー入力をする場合に問題あり

   1. ○ Ctrl[押下] "l" "a" "n" "n" "p" Ctrl[解放] 
      (ほぼ連続的(各キー操作間隔0.5s以内くらい)で実施)

   2. × Ctrl[押下] "l" "a" "n" [数秒の間] "n" "p" Ctrl[解放]

   3. ○ Ctrl[押下] [数秒の間] "l" "a" "n" "n" "p" Ctrl[解放]
      (ctrl後,最初のkeyeventまでは多少待っても大丈夫)

どうも,「ctrl を押して最初の "1キーイベント" はきちんと待つ」のですが,
ctrl を押してから 1キー以上のイベントが生じると,
その一連の(ほぼ連続した key press)イベントの後については,
約1秒程度無操作状態が続くと,
(押しっ放しにしている)モディファイヤの key release が発生してしまうようです.
(後ろに xev で見た挙動も付記します)
なお,shift等も全く同様の挙動になります.

# あまりローカルでは使っていなかったので細かく見ませんでしたが,
# ML115 G1 なんかも似たような挙動だった気がします

emacs とかで作業するには死ぬほどやりにくいですね.


● 質問
 a. 他の機種でこんな挙動見られたことのある方はいますか?
    (おそらくは ServerEngines の所為だろうと思ってますが)
 a'. 他の OS でも生じる問題なのか,それとも FreeBSD 固有の問題なのでしょうか?

 b. 何か解決する手段はありますでしょうか?
    (普通の USB keyboard 使ってみる? 今は手持ちがないので試していません)


● 補足説明
  xev(1)で見てみた際の出力と対応させて挙動を説明します.

(1) Ctrl key 押下
(2) 数秒待ってから "l" key 押下
(3) ほぼ連続操作で "l" を2回押す (それぞれCtrl+Lと認識される)
(4) Ctrl キーを押したまま待っていると約一秒後に… 
    勝手に Ctrl キーの KeyRelease 発生
(5) この時点で,実際には Ctrl キーは押し続けた状態だが,
    ctrl は release されていると Xorg は認識しているので,
    "l" キーを押すと ctrl + L ではなく 普通の"l"キー単独操作
    とアプリケーションに認識される
(6) 物理的に Ctrl キーを解放しても当然 KeyRelease は発生しない.
    もう一度 Ctrl キーを押し直すとまた(1)からの動作になる.
    (押し直せば問題ないともいえる)
(1)
KeyPress event, serial 30, synthetic NO, window 0x2800001,
    root 0x117, subw 0x0, time 3457661, (168,99), root:(172,309),
    state 0x0, keycode 66 (keysym 0xffe3, Control_L), same_screen YES,
    XKeysymToKeycode returns keycode: 37
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

(2) 数秒待ち
KeyPress event, serial 30, synthetic NO, window 0x2800001,
    root 0x117, subw 0x0, time 3463086, (168,99), root:(172,309),
    state 0x4, keycode 46 (keysym 0x6c, l), same_screen YES,
    XLookupString gives 1 bytes: (0c) "
                                       "
    XmbLookupString gives 1 bytes: (0c) "
                                         "
    XFilterEvent returns: False

(3)
KeyRelease event, serial 30, synthetic NO, window 0x2800001,
    root 0x117, subw 0x0, time 3463238, (168,99), root:(172,309),
    state 0x4, keycode 46 (keysym 0x6c, l), same_screen YES,
    XLookupString gives 1 bytes: (0c) "
                                       "
    XFilterEvent returns: False
(4)
KeyRelease event, serial 30, synthetic NO, window 0x2800001,
    root 0x117, subw 0x0, time 3464734, (168,99), root:(172,309),
    state 0x4, keycode 66 (keysym 0xffe3, Control_L), same_screen YES,
    XKeysymToKeycode returns keycode: 37
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
(5)
KeyPress event, serial 30, synthetic NO, window 0x2800001,
    root 0x117, subw 0x0, time 3472238, (168,99), root:(172,309),
    state 0x0, keycode 46 (keysym 0x6c, l), same_screen YES,
    XLookupString gives 1 bytes: (6c) "l"
    XmbLookupString gives 1 bytes: (6c) "l"
    XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x2800001,
    root 0x117, subw 0x0, time 3472390, (168,99), root:(172,309),
    state 0x0, keycode 46 (keysym 0x6c, l), same_screen YES,
    XLookupString gives 1 bytes: (6c) "l"
    XFilterEvent returns: False
(6)
 (key event なし)

● dmesg抜粋(ServerEngines関係)
ugen1.3: <ServerEngines> at usbus1
ukbd0: <ServerEngines SE USB Device, class 0/0, rev 1.10/0.01, addr 3> on usbus1
kbd2 at ukbd0
ums0: <ServerEngines SE USB Device, class 0/0, rev 1.10/0.01, addr 3> on usbus1
ums0: 8 buttons and [XYZ] coordinates ID=0

-- 
       ∧∧
Zzz.. (- - )⌒⌒⊇〜           川口 銀河
      ##############   ginga-free...@ginganet.org

メールによる返信