Wayland環境でloginシェルを変えたら日本語IMが使えない場合の解決方法
今回の内容
最近ログインシェルを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: 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
読むと下記ディレクトリのファイルを処理するようになっています。
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
ん?あやしいファイルがある。
# /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の設定ファイルを借りています。というのも、今後別のパッケージがなにかスクリプトを追加するかもしれないからです。
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
のようなファイルを作ると、環境変数が設定できるようになっています。
systemd自体が環境変数を保持するのでシステム全体の環境変数はここに纏めるというのも一つの手かもしれません。が、今後ディストリビューションが何をするかわからないので今回はやめました。
まとめ
以上、Wayland環境+zshで日本語IMを動かすための方法でした。
Discussion