対象は次のようなものです.
- PC-98
- FreeBSD/pc98 7.2, 7.4, 8.1, 8.2
- X.Org 7.4, 7.5
対象は次のようなものです.
目的は次のようなものです.
まだ速報レベルの内容です. 今後もいろいろ試行,調査し,ここの記述に反映させていきます.
目次
mwm
(その 1)mwm
(その 2)xkbcomp
, xkbprint
ここには,PC-98 + FreeBSD/pc98 7.2 + X.Org 7.4.0 の環境にて,X Window System に関連して遭遇したトラブルを記します. いずれもキーボードがらみです. これ以上増えて欲しくないです.
mwm (Motif Window Manager, open-motif-2.2.3) の,KeyBindings に設定されたキーの動作がおかしいです.
例えば,SHIFT + 1 で ! を入力しようとすると,Window Mwnu が現われて入力できません.
原因は,KeyBindings の取り扱いにおいて PC-98 と AT 互換機のキーコードの判別が完全でないことのようです.
すなわち,
暫定対策は,この機能を使わないようにすることです. $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 を参照するように記述されています. その xorg は base の 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 の役割だったのが,マッチするものがあってもここも実行されるようになりました.
その根拠は,
(これが仕様だと,base は機種ごとのオーダーメードにしなければならないので,bug でしょう.)
ただ,「一部の設定が変えられたらしい」と煮えきらないのは,この問題の真の原因,すなわちどの設定が壊されているか,あるいは余計な設定がされているのかは xkbcomp, xmodemap, xev からは見て取れないからです.
[2] /usr/local/share/X11/xkb/rules/ には pc98 と jp106 だけを記述した xfree98 というファイルもあるのですが,内容に誤りもあり,そのままでは利用することができませんでした. (そもそも,この二つを一緒に取り扱うことに合理性はないように思います.)
(補足) 現時点で最新の ports (2011.3.27) においても,この問題は解決しておりません.
ここに記した問題は,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 を終了させる設定をしておけば,それは効きます.)
なお,twm や fvwm2 ではこの問題は生じませんでした.
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) が採用され,上記の問題は解決しています.
ここに記した問題は,PC-98 だけでなく AT 互換機でも生じます.
以下のように xkbcomp や xkbprint を実行すると,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
両方とも,libX11 の XkbGetGeometry() がエラーを返しているのを受けて,エラーになります. libX11 のソースを点検してみて,凡ミスならむしろありがたいのですが.
これで実害のある人は少ないでしょうが,キーボード関連を変更した後の点検がいまいちという印象を持たざるを得ません.
今後,いつになるか分かりませんが,AT 互換機でのこれらの動作と対比させて原因を探りたいと思います.
→ AT 互換機でも,上記と同じエラーが出ます.
→ 解決しました. 先ず setxkbmap を実行すれば,この問題は生じません.
% setxkbmap % xkbcomp -a -xkb $DISPLAY % xkbprint $DISPLAY
情報源は以下のところです. (ここからの link は設定しておりません.)
https://bugs.freedesktop.org/show_bug.cgi?id=25873
xkbcomp, xkbprint の問題が解決したので,その詳細を説明するために用意したこの節はすっきりしてしまいました.
今度の X.Org 7.6 では XKB が version 2 になる予定なので,キーボードに関わる様々な話題はその環境で検討します. ただし,これが FreeBSD のどの version で採用されるかは不明です.