问题描述

startx 启动 GNOME 后,fcitx5 托盘图标在右上角有概率频繁闪烁。闪烁期间,打开任何程序都会导致桌面完全卡死。只能通过 SSH 远程杀掉 xinit 进程恢复。右键点击托盘图标 → 重新启动,大概率恢复正常。

本文由 AI 助手 opencode 生成

环境

  • OS: Gentoo Linux
  • DE: GNOME (通过 startx 启动)
  • 输入法: fcitx5 (5.1.17)
  • 相关包: app-i18n/imsettings, ibus-daemon

根因分析

启动时的竞态条件导致 XIM 服务器冲突:

  1. 90-xinput 脚本/etc/X11/xinit/xinitrc.d/90-xinput)启动时 unset 所有 IM 环境变量(GTK_IM_MODULEQT_IM_MODULEXMODIFIERS 等)
  2. imsettings-daemon 启动,接管 IM 环境变量管理
  3. D-Bus 自动激活 ibus-daemon/usr/share/dbus-1/services/org.freedesktop.IBus.service
  4. ibus-daemon 注册为 XIM 服务器(@im=ibus
  5. fcitx5 在 autostart 延迟 20 秒后启动,也注册自己的 XIM 服务器(@im=fcitx
  6. 两个 XIM 服务器冲突 → 应用打开时触发 xcb_grab_server() 死锁 → 桌面冻结
  7. 托盘闪烁 = fcitx5 在冲突窗口内的崩溃/重启循环
  8. 右键 → 重启发 fcitx5 = 重新干净注册 XIM → 冲突解除

关键证据

fcitx5-diagnose 输出中环境变量为空,但 GNOME 会话内 gsettings 已正确设为 fcitx:

GTK_IM_MODULE=fcitx    (gsettings: org.gnome.settings-daemon.plugins.xsettings overrides)
QT_IM_MODULE=fcitx     (通过 imsettings + gsettings 联动)
XMODIFIERS=@im=fcitx  (同上)

但启动窗口内 ibus-daemon 也被激活(journal 可见):

ibus-daemon --panel disable --xim

修复方案 (Plan C)

步骤 1:配置 imsettings 使用 fcitx5

创建 /etc/X11/xinit/xinput.d/fcitx5.conf

XIM=fcitx
XIM_PROGRAM=/usr/bin/fcitx5
XIM_ARGS=-d
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
SHORT_DESC="Fcitx 5"

创建 ~/.config/imsettings/xinputrc

source /etc/X11/xinit/xinput.d/fcitx5.conf

步骤 2:在 .xinitrc 中预设环境变量

exec gnome-session 之前加入:

export XMODIFIERS=@im=fcitx
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export SDL_IM_MODULE=fcitx

步骤 3(可选):屏蔽 ibus D-Bus 激活

如果闪烁仍然复现:

systemctl --user mask org.freedesktop.IBus.service

或直接删除 ibus D-Bus 服务文件:

rm /usr/share/dbus-1/services/org.freedesktop.IBus.service

验证

修复后检查环境变量是否持久化到所有进程:

cat /proc/$(pgrep fcitx5)/environ | tr '\0' '\n' | grep -E '^(GTK_IM_MODULE|QT_IM_MODULE|XMODIFIERS)'

确认输出均为 fcitx,且托盘图标不再闪烁、打开应用不再卡死。