Cygwin/Xがキーボード配列を英語(ENG)に設定する現象


Cygwin/Xを使うとキーボード配列をENG - いわゆる英語配列と呼ばれるUSキーボードのロケールに設定してしまう現象が起こることが有る。手元だと

Xwin -multiwindow

のようにMultiwindow WMを使うと何故か発生しない。
...個人的には-rootlessを使いたいのでちょっと調べてみると、https://github.com/mirror/xserver/blob/52d6a1e832a5e62289dd4f32824ae16a78dfd7e8/hw/xwin/winconfig.c#L285 ココでLoadKeyboardLayoutしているようだ。
実はWindows 8から、システムで同時に使用できるIMは1つまでという微妙な制限が追加されており、Xwinのこの実装はWindows8以降システム全体のキーボード配列を英語配列にしてしまうということになる。コードでは日本語ロケールであることを検証しているので、この現象も日本語固有ということになる。

Beginning in Windows 8: The input locale identifier is loaded for the entire system. This function has no effect if the current process does not own the window with keyboard focus.

というわけでデフォルトの日本語ロケールに戻すコマンドラインツールを書いてみた:

 hKl = LoadKeyboardLayout("00000411", KLF_ACTIVATE);

こんな感じで0x411のキーボードレイアウトをActivateすれば日本語に戻る。要するに何かWindowをShowWindowし、LoadKeyboardLayoutすれば良い。