fcitx5 托盘闪烁与桌面冻结问题修复
Gentoo, fcitx5, Linux, and startx
问题描述
startx 启动 GNOME 后,fcitx5 托盘图标在右上角有概率频繁闪烁。闪烁期间,打开任何程序都会导致桌面完全卡死。只能通过 SSH 远程杀掉 xinit 进程恢复。右键点击托盘图标 → 重新启动,大概率恢复正常。
本文由 AI 助手 opencode 生成
环境
- OS: Gentoo Linux
- DE: GNOME (通过 startx 启动)
- 输入法: fcitx5 (5.1.17)
- 相关包:
app-i18n/imsettings,ibus-daemon
根因分析
启动时的竞态条件导致 XIM 服务器冲突:
90-xinput脚本(/etc/X11/xinit/xinitrc.d/90-xinput)启动时 unset 所有 IM 环境变量(GTK_IM_MODULE、QT_IM_MODULE、XMODIFIERS等)imsettings-daemon启动,接管 IM 环境变量管理- D-Bus 自动激活
ibus-daemon(/usr/share/dbus-1/services/org.freedesktop.IBus.service) - ibus-daemon 注册为 XIM 服务器(
@im=ibus) - fcitx5 在 autostart 延迟 20 秒后启动,也注册自己的 XIM 服务器(
@im=fcitx) - 两个 XIM 服务器冲突 → 应用打开时触发
xcb_grab_server()死锁 → 桌面冻结 - 托盘闪烁 = fcitx5 在冲突窗口内的崩溃/重启循环
- 右键 → 重启发 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,且托盘图标不再闪烁、打开应用不再卡死。