top page > X Window System > here

PC-98 における X.Org 7 系 (問題点)


対象は次のようなものです.

  1. PC-98
  2. FreeBSD/pc98 7.2, 7.4, 8.1, 8.2
  3. X.Org 7.4, 7.5

目的は次のようなものです.

  1. 上記環境にて,X Window System に関連して遭遇したトラブルを紹介する.

まだ速報レベルの内容です. 今後もいろいろ試行,調査し,ここの記述に反映させていきます.


目次

1. 問題点とその対策
1.1 mwm (その 1)
1.2 mwm (その 2)
1.3 xkbcomp, xkbprint
2. 検討中の項目

1. 問題点とその対策

ここには,PC-98 + FreeBSD/pc98 7.2 + X.Org 7.4.0 の環境にて,X Window System に関連して遭遇したトラブルを記します. いずれもキーボードがらみです. これ以上増えて欲しくないです.

1.1  mwm  (その 1)

mwm (Motif Window Manager, open-motif-2.2.3) の,KeyBindings に設定されたキーの動作がおかしいです. 例えば,SHIFT + 1! を入力しようとすると,Window Mwnu が現われて入力できません.
原因は,KeyBindings の取り扱いにおいて PC-98 と AT 互換機のキーコードの判別が完全でないことのようです. すなわち,

  • Shift, Alt などの Modifier は,PC-98 と AT 互換機とではキーコードが違うが,正しく認識されている. すなわち,キーコードでなくそれに割り当てられた機能を認識する. (これが正常.)
  • それらと組み合わせて入力する Escape, Space などは,機能でなくキーコードとして認識される. しかも,AT 互換機のキーコードにより判別される!
    それらと同じキーコードを返すのは,PC-98 では 1, Delete のキーである. よって,例えば SHIFT + 1 と入力すると,KeyBindings として SHIFT + ESC と解釈されてしまう.
    (Tab のキーコードは両者で同じなので,正しく動作する.)

暫定対策は,この機能を使わないようにすることです. $HOME にて

% cp /usr/X11R6/lib/X11/system.mwmrc .mwmrc

として,このファイルの該当箇所を次のように修正します. すなわち,赤で示した ! により設定を comment out します. Tab に関わる二行を残したのは,{ } の中の全てを comment out するとこの設定が効かずに内部の default が使われてしまうからです.

Keys DefaultKeyBindings
{
!       Shift<Key>Escape        window|icon             f.post_wmenu  ← Shift + 1 に反応
!       Alt<Key>space           window|icon             f.post_wmenu  ← Alt + Delete に反応
        Alt<Key>Tab             root|icon|window        f.next_key
        Alt Shift<Key>Tab       root|icon|window        f.prev_key
!       Alt<Key>Escape          root|icon|window        f.circle_down
!       Alt Shift<Key>Escape    root|icon|window        f.circle_up
!       Alt Shift Ctrl<Key>exclam root|icon|window      f.set_behavior
!       Alt<Key>F6              window                  f.next_key transient
!       Alt Shift<Key>F6        window                  f.prev_key transient
!       Shift<Key>F10           icon                    f.post_wmenu
!       Alt Shift<Key>Delete    root|icon|window        f.restart
}

PC-98 + FreeBSD/pc98 6.2 + X.Org 6.9.0 + open-motif-2.2.3 の環境では,この問題は生じません. motif の version は同じなので,X の側の問題だと思うのですが.

ports/x11-drivers/xf86-input-keyboard からソースを取得して確認したのですが,この問題の原因は解りません. motif のソースも見るしかないようです.

/usr/local/share/X11/xkb/rules/base を次のように修正したら,この問題は生じなくなりました
(ファイルの冒頭に「これを修正するな」と書いてありますが,自己責任で無視します.)

--- base.org    2009-04-15 00:57:53.000000000 +0900
+++ base        2009-08-14 01:37:05.000000000 +0900
@@ -115,7 +115,7 @@
   macintosh_old        =       macintosh(old)
  $macs         =       macintosh
   thinkpadz60  =       xfree86(thinkpadz60)
-  *            =       xfree86
+  *            =       xfree98(pc98)

 ! layout[1]    =       keycodes
   $azerty       =       +aliases(azerty)

原因ですが,xkbcomp の仕様が変わったのか,それとも bug なのか,上記のファイルの「読み方」が変わり,本来の設定の一部に別の設定を上書きしているようです.[1] すなわち,

*            =       xfree86

の行は pc98 にとって必要ないはずなのに,この行を単に削除すると次のように設定に失敗します. (XFree86 や X.Org 6 系では削除しても問題は生じませんでした.)

(EE) XKB: Rules returned no components
(EE) XKB: No components provided for device Virtual core keyboard
(WW) Couldn't load XKB keymap, falling back to pre-XKB keymap

そこでこの行を残し,かつ上記のように書き換えました. (当然それは pc98 専用の base になります.)

→ 上記の修正だけで不具合は出ておりませんが,同様の箇所は他にもあるので,base を次の内容で置き換えました. すべての項目を 1 行だけにすることもできますが,何をやっているのか解らなくなるのでこのようにしました.
(これは要修正箇所を示したものではありません. 以下の内容で,すべてを置き換えて下さい.)

// DO NOT EDIT THIS FILE - IT WAS AUTOGENERATED BY merge.sh FROM rules/*.part
// $Xorg: xfree86,v 1.3 2000/08/17 19:54:42 cpqbld Exp $
//
//  2009 Modifier: S.Kimura

! model         =       keycodes
  pc98          =       xfree98(pc98)
  *             =       xfree98(pc98)

! model         =       geometry
  pc98          =       nec(pc98)
  *             =       nec(pc98)

! model         layout          =       symbols
  pc98          nec_vndr/jp     =       nec_vndr/jp(pc98)
  *             *               =       nec_vndr/jp(pc98)

! model         layout          =       compat
  pc98          nec_vndr/jp     =       pc98(basic)
  *             *               =       pc98(basic)

! model         =       types
  *             =       complete

なお,xorg.conf/usr/local/share/X11/xkb/rules/xorg を参照するように記述されています. その xorgbase の symbolic link なのですが,base を消去して xorg を実体のファイルとすると,次のようにエラーになります.

(EE) XKB: Couldn't open rules file /usr/local/share/X11/xkb/rules/base
(EE) XKB: No components provided for device Virtual core keyboard
(WW) Couldn't load XKB keymap, falling back to pre-XKB keymap

すなわち,勝手に base も読みに行っているようです. 逆に,xorg を消去してもエラーになります. この二つのファイルは内容を同一にするという目的からも symbolic link のままにしておくべきでしょう.[2]

[1] 現時点での最新 version である xkbcomp-1.0.5 を使っております.
「読み方が変わった」という根拠は,上述のように ! model の下に列挙する内容が * で終わっていないとエラーになるようになったことです. さらに,その * は本来はその上に記した文字列にマッチするものがない場合の default の役割だったのが,マッチするものがあってもここも実行されるようになりました. その根拠は,

  • pc98 に対応する設定にはなる. 従って,ここには確実にマッチしている.
  • /usr/local/share/X11/xkb/keycodes/xfree86 や,そこから派生する pc98 に本来必要ないファイルを消すと,それが「ない」と警告されてエラーになる.

(これが仕様だと,base は機種ごとのオーダーメードにしなければならないので,bug でしょう.)

ただ,「一部の設定が変えられたらしい」と煮えきらないのは,この問題の真の原因,すなわちどの設定が壊されているか,あるいは余計な設定がされているのかは xkbcomp, xmodemap, xev からは見て取れないからです.

[2] /usr/local/share/X11/xkb/rules/ には pc98jp106 だけを記述した xfree98 というファイルもあるのですが,内容に誤りもあり,そのままでは利用することができませんでした. (そもそも,この二つを一緒に取り扱うことに合理性はないように思います.)

(補足) 現時点で最新の ports (2011.3.27) においても,この問題は解決しておりません.

1.2  mwm  (その 2)

ここに記した問題は,PC-98 だけでなく AT 互換機でも生じます.

FreeBSD 8.1 + X.Org 7.5 (xserver 1.7.5) + mwm において,重大なエラーが発生しています. (FreeBSD 7.4, 8.2 でも.) すなわち,この環境にて Window (xterm, kterm, xclock, etc.) を二つ以上立ち上げ,一度 Focus を移動すると,キーボードもマウスのボタンも効かなくなります. (xfd など,例外もあります. また [Ctrl] + [Grph] + [BS] にて X server を終了させる設定をしておけば,それは効きます.)
なお,twmfvwm2 ではこの問題は生じませんでした.

ports の open-motif-2.2.3_6 は patch も含めてもう 5 年もそのままなので,最新版である 2.3.3 を自前で make して試してみましたが,この問題は同様に生じます.

→ 調べたら,以下のところに報告されていました. 修正を待ちましょう. (ここからの link は設定しておりません.)

http://www.openmotif.org/forum/general-questions/xorg-7-5-breaks-openmotifs-mwm

→ X server の log を見ると,以下のような箇所があります.

record: RECORD extension enabled at configure time.
record: This extension is known to be broken, disabling extension now..
record: http://bugs.freedesktop.org/show_bug.cgi?id=20500

試しに xorg.conf にて次のように record を最初から load しないようにします.

Section "Module"
   Disable  "record"
EndSection

すると mwm が立ち上がった当初から,すなわち Focus の移動以前に同じ症状になります. なので,原因は X.Org の側で record が disable にされてしまうことなのではないかと思います.

この問題は 2009.3.5 に報告され 2010.4.15 に解決しているようです. 先に引用した log は,X.Org 7.5 がこの解決を待たずに release されたがゆえの措置です. 残念ながら,その修正は FreeBSD の ports には反映されておりません. (そもそも反映できるような形で修正されているかも不明です.) X.Org 7.6 が採用されれば,この問題は解決するでしょう.

2011.3.27 に更新された ports では xserver 1.7.7 (2010.5.4) が採用され,上記の問題は解決しています.

1.3  xkbcomp, xkbprint

ここに記した問題は,PC-98 だけでなく AT 互換機でも生じます.

以下のように xkbcompxkbprint を実行すると,geometry の記述に問題はないのに,エラーが出ます.

% xkbcomp -a -xkb $DISPLAY
Warning:          Could not load keyboard geometry for :0.0
                  BadAlloc (insufficient resources for operation)
                  Resulting keymap file will not describe geometry

% xkbprint $DISPLAY
Fatal Error:      Cannot load geometry for :0.0
                  Exiting

両方とも,libX11XkbGetGeometry() がエラーを返しているのを受けて,エラーになります. libX11 のソースを点検してみて,凡ミスならむしろありがたいのですが.

これで実害のある人は少ないでしょうが,キーボード関連を変更した後の点検がいまいちという印象を持たざるを得ません.

今後,いつになるか分かりませんが,AT 互換機でのこれらの動作と対比させて原因を探りたいと思います.
→ AT 互換機でも,上記と同じエラーが出ます.

解決しました. 先ず setxkbmap を実行すれば,この問題は生じません.

% setxkbmap
% xkbcomp -a -xkb $DISPLAY
% xkbprint $DISPLAY

情報源は以下のところです. (ここからの link は設定しておりません.)

https://bugs.freedesktop.org/show_bug.cgi?id=25873

2. 検討中の項目

xkbcomp, xkbprint の問題が解決したので,その詳細を説明するために用意したこの節はすっきりしてしまいました.

今度の X.Org 7.6 では XKB が version 2 になる予定なので,キーボードに関わる様々な話題はその環境で検討します. ただし,これが FreeBSD のどの version で採用されるかは不明です.