有馬総一郎のブログ

(彼氏の事情)

2025年01月22日 07:24:43 JST - 5 minute read - Linux

一部のターミナルを起動すると固まるのでIBusからFcitx5に乗り換えた

AlacrittyRio TerminalWarpといった割かしモダンなターミナルを起動すると固まることが起きていた。起動して、数秒後にはCtrl-Alt-F3などで仮想コンソールの起動はできる状態なのだが、GUI操作できない。ログなど見ても分からず困っていた。

おま環

とりあえず、おま環な可能性もあるので、簡単に自分の環境を記しておく。デスクトップはGNONEだけども、COSMIC拡張機能を追加した形となる。まだalpha版しかリリースされていないデスクトップ環境「COSMIC DE」ではない。

  • OS: Pop!_OS 22.04 LTS x86_64
  • Kernel: Linux 6.9.3-76060903-generic
  • Shell: zsh 5.8.1
  • Display (DELL S2721QS): 3840x2160 @ 60 Hz in 27"
  • Display (GSM5AB8): 3840x2160 @ 60 Hz in 22"
  • DE: GNOME 42.9
  • WM: Mutter (X11)
  • CPU: AMD Ryzen 5 5500U (12) @ 4.06 GHz
  • GPU: AMD Lucienne [Integrated]
  • rioterm 0.2.3
  • alacritty 0.16.0-dev (c9c41e63)
  • warp v0.2025.01.08.08.02.stable_04

ちなみにRio Terminalはdebからインストールしようとすると、依存関係でエラーとなったので、ビルドした。

以下のパッケージには満たせない依存関係があります:
 rioterm : 依存: libc6 (>= 2.39) しかし、2.35-0ubuntu3.8 はインストールされようとしています

WarpはAppImageでの起動だけど、固まる。

原因っぽいコマンド

ibusだと固まるわけでなく、 IBus-SKKで設定が保存されるようにするで記したとおりibus-daemon --config=/usr/libexec/ibus-dconf -drxした後にターミナルを起動すると固まる。gnome-terminalkittyWezTermなどは平気。

Alacritty freeze · Issue #5174 · alacritty/alacrittyにも以下のような コメントがある。

I do some debugging and found that ibus is the reason why Alacritty freeze. Remove these lines from my .bashrc solves the problem

export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
ibus-daemon -drx

Fcitx5の変更

ibusとGNOMEは統合されているのであまり変更したくないが、 Pop!_OS:日本語入力をiBusからFcitx5へ変更|Histoneなど見ながら変更していく。

  1. fcixt5, fcitx5-[mozc, anthy, skk]などインストール

  2. im-configfcixt5を選択する

  3. Input Method Panel - GNOME Shell 拡張機能をインストールする

  4. cp -r /usr/share/applications/org.fcitx.Fcitx5.desktop ~/.config/autostart/fcitx.desktopして、自動起動するアプリケーションとしてfcitx5を登録する。

    設定からデスクトップファイルを選択すると、Exec=/usr/share/applications/org.fcitx.Fcitx5.desktopとなるのだけど、それだとfcitx5が起動されないのでコピーとしている。もしくはExec=/usr/bin/fcitx5と編集すれば良いと思う。

開発中のデスクトップCOSMIC DEではInputMethodを選択できる予定1だ。

昔、GNOME環境だとアプリメニューを開いたときに入力ソースの切り替えができずに日本語が入力できなかった覚えがある。しかし、それは記憶違いなのか、普通に入力できる。ひょっとすると単純に入力ソース切り替えショートカットキーが被っていただけかなぁ?

fcitx5

ibusが削除できない

InputMethodは一つだけである方が望ましいのだけど、GNOMEデスクトップ環境だとibusは削除させてくれない。前に他のディストリビューションでibus削除したら依存関係エラーにもならず、そのままデスクトップ環境が吹き飛んだこともあるので、無理に削除するのは宜しくないかも。

$ sudo apt remove ibus 
・・・中略・・・
以下のパッケージには満たせない依存関係があります:
 pop-desktop : 依存: ibus-table しかし、インストールされようとしていません
               推奨: ibus-table-emoji しかし、インストールされようとしていません
               推奨: libreoffice-calc しかし、インストールされようとしていません
               推奨: libreoffice-impress しかし、インストールされようとしていません
               推奨: libreoffice-writer しかし、インストールされようとしていません
               推奨: libreoffice-ogltrans
E: エラー、pkgProblemResolver::Resolve は停止しました。おそらく変更禁止パッケージが原因です。

X11環境でのprofile関連ファイルの流れは以下のようになっていた。

/etc/gdm3/Xsession

# First read /etc/profile (resp. /usr/etc/profile) and .profile
if [ -f /etc/profile ]; then
  source_with_error_check /etc/profile
elif [ -f /usr/etc/profile ]; then
  source_with_error_check /usr/etc/profile
fi
if [ -f "$HOME/.profile" ]; then
  source_with_error_check "$HOME/.profile"
fi
# Second read /etc/xprofile (resp. /usr/etc/xprofile)  and .xprofile for X specific setup
if [ -f /etc/xprofile ]; then
  source_with_error_check /etc/xprofile
elif [ -f /usr/etc/xprofile ]; then
  source_with_error_check /usr/etc/xprofile

fi
if [ -f "$HOME/.xprofile" ]; then
  source_with_error_check "$HOME/.xprofile"
fi

Pop!_OSでは、/etc/profile.d/pop-im-ibus.shを読み込んで、InputMethodの環境変数を設定している。

/etc/profile.d/pop-im-ibus.sh

export GTK_IM_MODULE="ibus"
export QT_IM_MODULE="ibus"
export XMODIFIERS="@im=ibus"

なので、環境変数などもfcitx5にしておいたほうが良いということで設定しておく。

~/.xprofile

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
ibus-daemon exit &

Disabling ibus in popos : pop_osなど見ると、ibus-daemonのファイル名にbak付けて無効化しろとあったが、ibus-daemon exitとしておけば、arimaso+ 3172 0.1 0.0 0 0 tty2 ZN 06:32 0:00 [ibus-daemon] <defunct>となっていたので、それでいいかな、と。

あと、IM関連の設定するとき、IMの実行ファイル有無やGTK_IM_MODULE環境変数だけで判定するのは、正しく動かなそうなので、~/.xinputrcがある場合、そこの記述を見るようにした。

[[ -f ~/.xinputrc ]] && IM=$(awk '/run_im/ {print $2}' ~/.xinputrc 2> /dev/null)
if [[ -z "$IM" ]]; then
  if type "fcitx5" > /dev/null 2>&1; then
    IM=fcitx5
  else
    IM=ibus
  fi
fi

とりあえず、ちゃんと動いているっぽい。