Wayland環境でloginシェルを変えたら日本語IMが使えない場合の解決方法

2023/10/12に公開

今回の内容

最近ログインシェルをzshに切り替えたのですが、急に日本語IMが起動しなくなりました。
今回はその解決方法を紹介します。

クイックサマリ

状況整理

まずは状況の整理をしてみます。使っていたアプリは下記のとおりです。

OLD NEW
Desktop KDE Plasma KDE Plasama
Shell bash zsh
IM fcitx5+mozc fcitx5+mozc
IM Selecter im-config im-config

再起動して初めて動かないことに気が付きますから、正直これだけでは急に日本語入力が使えなくなった時に何が原因かわからないと思います。

1.シェルをデフォルトのbashからzshに変える

ログインシェルを変更
$ chsh /bin/zsh

2.再起動したら日本語IMが起動していない事に気がつく

→システムバーに日本語入力のアイコンがない
→IM設定の画面を覗くと、起動していないけど起動する?とメッセージがあり起動すると動く
→しかし、Firefoxなど一部のアプリでは使用できない。
→再度bashに戻すと動く

以前Xorg環境で悩んだときと同じ。経験から起動スクリプトが動いていないと想像。

解析

以前上記の記事で解析した起動スクリプトを解析しましたが、当然何も変わっていません。しかしこれはデスクトップ起動時に正しくfcitx5が起動しないときの現象なのは間違いありません。そしてそれはログインシェルを変更したことで起きています。

文法の差異

それならば、bashとzshの互換性の問題である可能性がありますが、一般的な文法で動かないのは考えづらいです。どちらもPOSIX準拠です。

起動プロセスの違い

であるならば、bashとzshで起動時のプロセスが違う事になります。しかし、グラフィカルログインになっている為、ログインするまではシステムデフォルトのshが使われるはずです。

ということは、ログイン画面を出しているsddm(KDEの場合。Xorg純正のxdmやGnomeのgdmもあり。)が原因と考えられます。

ここで、自分がWayland環境の起動を理解していない事に気が付きました。

原因

ウィンドウシステム起動フロー

前回の記事でも書いた起動プロセスをもう一度みます。これはXorgだけの場合です。

これをもう少し細かく書いてみます。Waylandの場合も記載します。

わかりましたか???
そう、実はWaylandの場合、Xsessionの起動スクリプトは処理されません

bashの処理を覗く

bashでは起動していたのですから、それがどこか探します。すると、なんとココ。

/etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

~~ 一部略 ~~

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do #/etc/profile.d/にあるすべての*.shを実行
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

読むと下記ディレクトリのファイルを処理するようになっています。

/etc/profile.d
01-locale-fix.sh    cedilla-portuguese.sh  gawk.csh              Z97-byobu.sh
apps-bin-path.sh    debuginfod.csh         gawk.sh               Z99-cloudinit-warnings.sh
bash_completion.sh  debuginfod.sh          im-config_wayland.sh  Z99-cloud-locale-test.sh

ん?あやしいファイルがある。

im-config_wayland.sh
# /etc/profile.d/im-config_wayland.sh
#
# This sets the IM variables on Wayland.

if [ "$XDG_SESSION_TYPE" != 'wayland' ]; then  #セッションタイプがwayland以外は終了
    return
fi

# don't do anything if im-config was removed but not purged
if [ ! -r /usr/share/im-config/xinputrc.common ]; then #必要なファイルがない場合は終了
    return
fi

if [ -r /etc/X11/Xsession.d/70im-config_launch ]; then
    . /etc/X11/Xsession.d/70im-config_launch    #ここ!Xsessionで使用する設定ファイルを呼び出す。
fi

解決方法

つまりWaylandの場合、Xsessionの各スクリプトを実行しないため、別の場所で処理をすれば良いのです。
これはいくつか方法があります。

1./etc/zsh/zprofile

この問題の原因がわかったならば、bashが/etc/profileでやっている処理はzshでもやるべきです。どうやって実装するかについては人それぞれ考えがあると思います。私の場合は、このようにしました。ようはbashの設定ファイルを借りています。というのも、今後別のパッケージがなにかスクリプトを追加するかもしれないからです。

/etc/zsh/zprofile
if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

2./etc/environment.d/

environment.d はsystemdの仕組みでここに例えばim-env.confのようなファイルを作ると、環境変数が設定できるようになっています。
https://wiki.gnome.org/Initiatives/Wayland/SessionStart

https://tech.spacely.co.jp/entry/2023/07/20/101537

systemd自体が環境変数を保持するのでシステム全体の環境変数はここに纏めるというのも一つの手かもしれません。が、今後ディストリビューションが何をするかわからないので今回はやめました。

まとめ

以上、Wayland環境+zshで日本語IMを動かすための方法でした。

Discussion