訂正 (2026-08-08)
この記事の当初の結論「ユーザー側の設定では解消できない」は 誤りでした。
/etc/environmentにIME環境変数を設定することで、Ctrl+Spaceでの直接入力が動作するようになりました。 結論だけ必要な方は 追記: 解決した へ。以下の調査記録は、当時どう考えて誤った結論に至ったかの記録として、そのまま残します。
事象
Street Fighter 6のチャット欄でCtrl+Space(fcitx5のトリガーキー)を押しても、日本語入力(Mozc)に
切り替わらない。ローマ字のまま反応しない。
| 項目 | 値 |
|---|---|
| OS | Arch Linux |
| WM | Sway (swayfx) |
| IME | fcitx5 + fcitx5-mozc |
| ゲーム | Street Fighter 6 (Steam, AppID 1364780) |
| Proton | Proton Experimental / GE-Proton11-3 |
当時の結論(誤り)
Proton公式ビルドは意図的にXIMを無効化しており、加えてWineの新しいIME実装がキー入力を XIMサーバーまで橋渡ししていない。この二つが重なっているため、レジストリでXIMを 再有効化しても効果が出ない。Street Fighter 6固有の不具合ではなく、Wine/Proton全体に 共通する構造的な制約であり、ユーザー側の設定では解消できない。
——これが誤りだった。 実際には環境変数がゲームの起動経路まで届いていなかっただけの可能性が高い。 詳細は末尾の追記を参照。
当時の根拠
以下は2026-08-06時点で実際に観測した内容。観測自体は正しいが、そこから導いた結論が誤っていた。
Sway/fcitx5の設定は正常 — Ctrl+Spaceに該当するbindsymはなし、GTK_IM_MODULE/
QT_IM_MODULE/XMODIFIERSはenvironment.dで正しく設定済み、fcitx5のトリガーキーも
Control+spaceのままでXIMアドオンも無効化されていない。
後から振り返ると、ここが見落としの核心だった。 「
environment.dで設定済み」であることは確認したが、 その変数がSteam経由で起動されるゲームプロセスまで届いているか は確認していなかった。
Protonは意図的にXIMを無効化している — Proton公式リポジトリのIssueに記載がある。
XIM is disabled for working around a X11 issue
古いlibX11のクラッシュを避けるため、Valve配布の公式Protonはビルド時にXIMサポートを
無効化している。fcitx5はXIM経由でWineアプリと通信するため、この時点で経路が断たれる。
レジストリでの再有効化は効果なし — 別のIssueにある回避策として、Wineのレジストリに次のキーを追加すればXIMを強制的に再有効化できるとされている。
[HKCU\Software\Wine\X11 Driver]
"UseXIM"="y"
WINEPREFIX="" \
"/files/bin/wine" reg add \
"HKCU\Software\Wine\X11 Driver" /v UseXIM /t REG_SZ /d y /f
reg query・user.regの両方でUseXIM="y"の書き込みは確認できるが、挙動は変わらない。
WINEDEBUGのログがキー入力の経路を示している — 同じprefixでnotepad.exeを起動し、SF6固有の
問題かどうかを切り分けた。
WINEDEBUG=+xim,+ime,+imm wine notepad
notepadでも症状は同じで、SF6固有のバグではないと確認できる。ログではxic_createは成功して
XICが生成されている(fcitx5との接続自体は確立している)。
03f8:trace:xim:xic_create xim 0x..., hwnd 0x300c6
03f8:trace:xim:xic_create created XIC 0x55555d42c140
ところがCtrl+Spaceを押した瞬間のログにxim系の出力は現れず、imm系だけが動く。
03f8:trace:imm:ImeProcessKey himc 0x..., vkey 0x20
03f8:trace:imm:ime_driver_call processing vkey 0x20, scan 0x39 -> 0
戻り値0は「このキーはIMEで処理しなかった」という意味で、Wineの新しいIME処理ロジックが
キーを受け取った上で処理せずアプリへ素通りさせている。XIMサーバーへの接続は生きているのに、
キー入力そのものがそこまで届かない。レジストリでUseXIMを有効化しても効果がなかったのはこのためだ。
この検証には落とし穴があった。
wine notepad.exeは対話シェルから手動で起動しているため、 シェルの環境変数(~/.zshrc等で設定されたIME関連変数)が乗った状態で動いている。 一方、実際のゲームはSteam経由で起動される。テスト環境と本番環境が違っていた。
fcitx5-remoteでの強制トグルも反映されない — fcitx5-remote -tでDBus経由でIME状態を
直接トグルしても、fcitx5自体の状態は変わるがWineアプリ側の入力コンテキストには反映されない。
XIMのキー処理を経由しない限り、外部からの強制トグルは意味を持たない。
GE-Protonでも同一症状 — GE-Protonで
同じprefix・同じ手順を再検証しても結果は同じで、notepadでCtrl+Spaceを押してもxim系ログは
沈黙したまま。公式・コミュニティ両ビルドで同一の症状が出るため、特定パッチの有無ではなく
Wine本体のIME実装が持つ構造的な制約と判断できる。
Windowsネイティブ環境なら翻訳レイヤーを挟まずWindows自体のIME基盤を直接使うため、 この問題自体が発生しないはずだ(筆者の環境では未検証、推測にとどまる)。
当時の回避策: クリップボード経由の貼り付け
この節は当時の運用の記録。現在は不要になった。
Wineアプリ内での直接入力は諦め、クリップボード経由に切り替える。クリップボードの同期は IME/XIMの仕組みから独立しているため、ここだけは問題なく動く。
- 別のアプリでMozcを使って日本語を入力する
- コピーする
- Street Fighter 6のウィンドウに戻り、チャット欄で
Ctrl+V
筆者はWaydroid上のPS AppとGboardをこの用途に使っている。Waydroid内で日本語を打ってコピーし、
ホスト側にCtrl+Vで貼り付ける経路はすでに動作を確認済み。ちなみにGboard内の言語切り替えは
Ctrl+SpaceではなくShift+Spaceだった。理由はまだわかっていない。
追記 (2026-08-08): 解決した
/etc/environment に以下を追記したところ、Ctrl+Spaceでの直接入力が動作するようになった。
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx
もともとはSteam本体(ネイティブ版)でCtrl+Spaceが効かない別件を調べていて見つけた設定だが、
適用後にSF6のカスタムルームチャットでも同時に直った。Waydroid+Gboardのクリップボード運用は
不要になった。
なぜ直ったのか(ソースで確認した)
~/.config/environment.d/ と ~/.xprofile には以前からIME関連の環境変数を設定していた。
それでも直らず、/etc/environment に書いたら直った。この違いがどこから来るのか、
実際のソースコードを読んで確認した。
.xprofileは、そもそもWaylandセッションでは一度も読まれない。 筆者の環境は
SDDM(ディスプレイマネージャ) → Sway(Waylandコンポジタ)という構成。SDDMがWaylandセッションを
起動するスクリプト本体(wayland-session、
公式ソースで中身を確認)はこうなっている。
case $SHELL in
*/bash|*/zsh)
exec $SHELL --login -c 'exec "$@"' - $@
;;
...
bash/zshの場合、ログインシェルを--loginモードで起動するだけで、.xprofileという
文字列はこのスクリプトのどこにも出てこない。.xprofileを読むのはX11向けの
Xsessionスクリプトの方で、
Wayland専用のwayland-sessionには最初から実装されていない。環境変数が「届かなかった」
というより、.xprofile自体がそもそも実行されていなかった。
Steam Linux Runtime(pressure-vessel)は、環境変数を独自にフィルタしているわけではない。
Steamが使ってるサンドボックス機構のソース(steam-runtime-tools、
git cloneして確認)、pressure-vessel/wrap-context.cにこうある。
self->original_environ = g_get_environ ();
g_get_environ()はGLibの関数で、呼び出し元プロセス(つまりSteam自身)が、その時点で
実際に持っている環境変数をそのままコピーする。 サンドボックスが用意する環境は、
このoriginal_environを土台に組み立てられる(pressure-vessel/wrap.cの
pv_bind_and_propagate_from_environなど)。つまり仕組みとしては「Steamの環境に有れば、
サンドボックスにも伝わる」「Steamの環境に無ければ、サンドボックスにも無い」というだけで、
pressure-vessel側が能動的にIME変数を弾いているわけではなかった。
/etc/environmentは、この両方の問題を回避できる場所にある。 PAM(pam_env)が
ログインセッションを開く時点――SDDM経由でシェルが起動するよりも、Swayが立ち上がるよりも
前――に読み込まれる。Wayland/X11の違いにも、systemd –userのunit起動経路にも依存しない。
この結果、Sway → (Sway経由で起動する)Steam → Steamがg_get_environ()で捕まえる環境、
という鎖が最初から繋がっていて、確実にサンドボックス内まで届く。
~/.config/environment.d/*.confについては、systemd --userマネージャが起動時に読み込んで
マネージャ自身が管理するunit用の環境として保持する仕組みで、Swayがsystemd –userの
unitとして起動されていない(ログインシェルから直接exec swayするような構成の)場合、
Swayやその子プロセスへ自動的に伝播するとは限らない。この部分はユーザー環境の起動設定
(どうSwayを起動しているか)に依存するため、今回はそこまでは立ち入らない。
wine notepad.exeでXICの作成に成功していたのも、あれが対話シェル(すでに/etc/environmentや
シェルの設定ファイルの変数が乗っている)から直接起動されていたためで、Steam経由の起動とは
環境が違っていた、というのも今回の調査で裏が取れた。
教訓
同じ症状で調べている人向けに、この失敗から言えることを書いておく。
- 「設定ファイルに書いてある」と「そのプロセスに届いている」は別の話。 環境変数の問題を疑うときは、
設定ファイルを読むのではなく、実際に対象プロセスの環境を見る(
cat /proc/<pid>/environ | tr '\0' '\n')。 - 手動起動したテストアプリは、本番と同じ環境で動いていない可能性がある。 特にSteam/Flatpak/Snapのような サンドボックスを挟む起動経路では、対話シェルからの手動テストは再現になっていないことがある。
- 上流のIssueに「既知の制約」と書いてあると、そこで思考が止まりやすい。Issueの記述が自分の症状の 原因である保証はない。
