Cygwin X サーバー (XWin) で英語キーボードにされてしまう現象を回避


CygwinのXサーバーを -rootless で起動すると、勝手に英語キーボードにされてしまう(良く知られた?)現象に遭遇。以下の手順で解消した。

日本語配列キーボードの設定

ホームディレクトリに、設定ファイル .XWinrc を作成し、以下を記述。

XKBModel jp106
XKBLayout jp

これで、Xクライアントでキーボードを日本語配列で使用できるようになるが、タスクトレイの言語バーに不要な「ENG 英語(米国) / US キーボード」という項目が追加されキーボード設定からも削除できなくなる、という症状が残る。
キーボード設定で「いったん英語キーボードを追加してから改めて削除」することで一応項目を削除できるが、Xを起動するたびに「ENG...」の項目が復活するので、これは無意味。

解決策

「Cygwin/Xがキーボード配列を英語(ENG)に設定する現象」によると、日本語キーボードの場合のみ強制的に英語キーボードを読み込むという処理がされていることが原因のよう。
コードを眺めると、日本語キーボードかどうかは GetKeyboardType() で判別している。そこで、さらにコレをキーワードに検索したところ、別の問題への対処ではあるが、バイナリファイルのシンボルを強制的に書き換えてチェックを無効にするという荒技を発見。これに倣って、XWin.exe の該当シンボルを書き換える。
バイナリエディタは面倒なのでsedでちゃちゃっと。

# cd /usr/bin
# cp XWin.exe XWin.exe.bak
# sed 's/GetKeyboardType/IsWindowEnabled/' < XWin.exe.bak > XWin.exe

かなり強引な方法だが、これにて一見落着!