🔡

Wayland + IBus 環境の Compose キーが Electron 製アプリケーションで動作しなくて困った話

に公開

Linux + Wayland + iBus の環境において(XWayland 上の?)Electron 製アプリケーションで Compose キーが動作しなかったので、解決方法の備忘録を残す。

環境

  • OS: Fedora Linux 42 (Workstation Edition)
  • DE: GNOME 48.7 (Wayland)
  • IME: IBus 1.5.32
  • Compose キー設定: 右 Alt キー (ralt)
  • 検証したアプリケーション:
    • Discord 0.0.118 (RPM Fusion)
    • Obsidian 1.11.5 (AppImage)
    • Slack 4.46.99 (Flatpak)
    • TETR.IO Desktop 10.0.0 (.tar.gz)
    • Spotify 1.2.74.477.g3be53afe (Flatpak)
    • Steam 1.0.0.84 (Flatpak) ← 解決できなかった

※ Spotify と Steam は Chromium Embedded Framework (CEF) だが、同じく動作していなかった。
※ Visual Studio Code も Electron 製のはずだが、初めから Compose キーが正常に動作した。
※ ちなみに Google Chrome では普通に初めから動作した。

結論

対象のアプリケーションに環境変数 IBUS_ENABLE_SYNC_MODE=1 を渡して起動することで、キー入力イベントの処理を同期モードで行うように強制する。これで Compose キーが動作するようになった。

Discord の場合の例

env IBUS_ENABLE_SYNC_MODE=1 Discord

※ 私の環境では Discord のバイナリの頭文字が大文字だった。

非同期モードよりはパフォーマンスが悪くなるかもしれないが、今のところはパフォーマンス低下などは感じられない。

設定の永続化(ランチャー)

デスクトップエントリ.desktop ファイル)を使用している場合は、それらも更新する。

Discord の場合の例

デスクトップエントリが自動で作成されたものなら複製:

cp /usr/share/applications/discord.desktop ~/.local/share/applications/

複製したファイルを編集:

discord.desktop
-Exec=/usr/bin/Discord
+Exec=env IBUS_ENABLE_SYNC_MODE=1 /usr/bin/Discord

Flatpak の場合は flatpak override で環境変数を渡した。

Slack (Flatpak) の場合の例

# これはシステム全体への適用
sudo flatpak override --env=IBUS_ENABLE_SYNC_MODE=1 com.slack.Slack

スタートアップアプリケーションの設定 (~/.config/autostart/*.desktop) も、必要に応じて再生成または編集する。

試したけどだめだったこと

Wayland ネイティブ起動 (--ozone-platform=wayland)

--ozone-platform=wayland フラグでの起動では、Compose キーは動作するようになったが、日本語入力ができなくなった。

setxkbmapxmodmap で直接指定

setxkbmap -option compose:raltxmodmap -e "keycode 108 = Multi_key" でキー設定を直接指定してみたが、効果はなかった。

xev コマンドで確認をすると Multi_key の信号自体は OS から送られているようなので、IBus とアプリケーションの間が怪しくなってきた。

原因の仮説?

IBus 1.5 はデフォルトではキー入力のイベントを同期的に処理するはず(?)だが、XWayland 上のアプリケーションとの間では何らかの理由で非同期処理になっていてズレが生じていた?

補足

他には、代替文字キー( 設定 > キーボード > 代替文字キー)に Compose キーと同じキーが割り当てられてしまってはいないかも確認するといいかも。

もしかしたら Fcitx に移行したら解決するのかもしれないが、移行が面倒だったので今回はこの方法で解決させた。

免責事項

これまでの話は、同様の方法でこの問題を完全に解決できることを保証するものではありません。

Discussion