openeuler2509 fcitx5 输入法排查与修复记录
【摘要】 openeuler2509 fcitx5 输入法排查与修复记录本文档完整记录 openEuler 25.09 + UKUI + VNC 环境下 fcitx5 输入法不可用、无法切换五笔等问题的排查过程、根因、修复步骤与验证方法,供后续维护参考。 1. 环境项目值系统openEuler 25.09(内核 7.2.2 x86_64)桌面UKUI(ukui-session,窗口管理器 kwin)...
openeuler2509 fcitx5 输入法排查与修复记录
本文档完整记录 openEuler 25.09 + UKUI + VNC 环境下 fcitx5 输入法不可用、无法切换五笔等问题的排查过程、根因、修复步骤与验证方法,供后续维护参考。
1. 环境
| 项目 | 值 |
|---|---|
| 系统 | openEuler 25.09(内核 7.2.2 x86_64) |
| 桌面 | UKUI(ukui-session,窗口管理器 kwin) |
| 显示 | VNC:Xvnc :1(1920x1020,端口 5901),:0 是 lightdm-greeter |
| 输入法框架 | fcitx5 5.1.12(fcitx5-chinese-addons 5.1.6,含拼音/五笔) |
| 输入法列表 | keyboard-us(英文)+ wbpy(五笔拼音,DefaultIM=wbpy) |
| 环境变量约定 | XMODIFIERS=@im=fcitx(注意原脚本曾误写为 =fcitx,已修正)、GTK_IM_MODULE=fcitx、QT_IM_MODULE=fcitx |
2. 问题现象
- VNC 登录后 fcitx5 输入法不可用 / 时好时坏;
- 出现 fcitx5 托盘窗口,但点击无法切换输入法(无法切到五笔);
- 日志中出现
Failed to open xim, retrying。
3. 根因分析
3.1 双实例 + 会话 D-Bus 分裂(切换失效的根本原因)
/root/.vnc/xstartup 原先写法:
unset DBUS_SESSION_BUS_ADDRESS
DISPLAY=:1 fcitx5 -d --replace >/dev/null 2>&1 & # 提前、无总线启动
lightdm &
ukui-session &
问题链:
unset DBUS_SESSION_BUS_ADDRESS后启动的 fcitx5 运行在私有会话总线上;- 桌面应用(ukui-session 启动的)各自跑在桌面会话总线上,看不到 fcitx5;
- 桌面总线上的应用请求
org.fcitx.Fcitx5时,D-Bus 自动激活出第二个 fcitx5 实例; - 两个 fcitx5 实例争抢 XIM 槽位 →
Failed to open xim, retrying→ 输入法失灵、切换无效。
3.2 托盘图标(次要)
- fcitx5 托盘图标由
notificationitem插件(StatusNotifierItem,SNI)提供; - 本 openEuler 5.1.12 构建里
GlobalConfig的DisabledAddons=notificationitem配置运行时实际不生效(插件仍被加载,/proc/<pid>/maps可证); - 本机 ukui-panel 虽有
StatusNotifierWatcher,但 fcitx5 的StatusNotifierItem未注册(总线ListNames中无org.kde.StatusNotifierItem-*),因此实际不显示托盘图标; - 窗口树中的 “Fcitx5 Input Window” 是候选词输入窗口(打字必需),不是托盘,勿混淆。
4. 修复步骤
4.1 现场修复(杀掉双实例,在同一桌面总线上重启单个 fcitx5)
# 1) 获取桌面会话总线地址(来自 ukui-session / dbus-launch 进程环境)
tr '\0' '\n' < /proc/$(pgrep -f 'dbus-launch --exit-with-session' | head -1)/environ \
| grep '^DBUS_SESSION_BUS_ADDRESS=' # 形如 unix:path=/tmp/dbus-XXXX,guid=...
# 2) 杀掉全部 fcitx5 实例
kill $(pgrep -x fcitx5); sleep 2
# 3) 携带桌面总线地址重启单个 fcitx5
DBUS_SESSION_BUS_ADDRESS='unix:path=/tmp/dbus-XXXX,guid=...' \
DISPLAY=:1 fcitx5 -d --replace >/dev/null 2>&1 &
4.2 修改 /root/.vnc/xstartup(保证登录时正确启动,最终内容)
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export GTK_IM_MODULE='fcitx'
export QT_IM_MODULE='fcitx'
export XMODIFIERS='@im=fcitx'
lightdm &
ukui-session &
# 等待桌面会话总线就绪后,再在同一 D-Bus 上启动 fcitx5,避免桌面总线自动拉起第二个实例
i=0
while [ $i -lt 20 ]; do
BUS=
for PID in $(pgrep -x ukui-session; pgrep -f 'dbus-launch --exit-with-session'); do
BUS=$(tr '\0' '\n' < /proc/$PID/environ 2>/dev/null | sed -n 's/^DBUS_SESSION_BUS_ADDRESS=//p')
[ -n "$BUS" ] && break 2
done
i=$((i+1))
sleep 1
done
[ -n "$BUS" ] && export DBUS_SESSION_BUS_ADDRESS="$BUS"
DISPLAY=:1 fcitx5 -d --replace >/dev/null 2>&1 &
要点:
- 必须遍历所有 ukui-session 进程再取
DBUS_SESSION_BUS_ADDRESS:pgrep -x ukui-session | head -n1会命中没有该变量的进程(真正的变量在 dbus-launch 的子进程上),导致取不到地址、等待 20 秒超时后 fcitx5 又在无总线状态下启动(即又回到 3.1 的坑); - fcitx5 必须与桌面应用共用同一会话总线,否则 D-Bus 会再次自动拉起第二个实例。
4.3 禁用托盘图标配置(尽力而为)
~/.config/fcitx5/config 的 [Behavior] 节:
[Behavior]
# Force Disabled Addons
DisabledAddons=notificationitem
⚠️ 如实说明:本构建中该配置未真正生效(见 3.2),但本机 SNI 本就未注册,实际观察结果即"无托盘图标"。若日后托盘图标出现,可考虑面板侧隐藏或更换 fcitx5 版本再查。
4.4 验证
export DISPLAY=:1
# 环境变量带桌面总线(按 4.1 取到的值)
# 1) 实例数应为 1
pgrep -a -x fcitx5; pgrep -c -x fcitx5
# 2) 切换五笔/英文
fcitx5-remote -s wbpy; fcitx5-remote -n # 应输出 wbpy
fcitx5-remote -s keyboard-us; fcitx5-remote -n # 应输出 keyboard-us
# 3) XIM 已注册
xprop -root | grep XIM_SERVERS # 应含 @server=fcitx
# 4) 无托盘图标(SNI 未注册,计数为 0)
dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus \
org.freedesktop.DBus.ListNames | grep -c StatusNotifierItem
# 5) 窗口检查(需先安装:dnf install -y xwininfo)
xwininfo -root -tree | grep -iE 'fcitx' # 只应有 Fcitx5 Input Window(候选词窗)
已验证结果:单实例 ✅、wbpy ↔ keyboard-us 切换正常 ✅、XIM 已注册 ✅、无托盘窗口 ✅。
5. 日常使用
| 快捷键 | 功能 |
|---|---|
Ctrl+Space |
英文(keyboard-us)↔ 五笔拼音(wbpy)切换 |
Super+Space |
输入法组轮换 |
| 候选词窗 | “Fcitx5 Input Window” 为打字必需的候选窗,非托盘 |
若某个已打开的应用仍打不出中文:重启该应用即可(应用会重新连接 XIM/输入法服务),新打开的窗口不受影响。
6. 注意事项与坑(备忘)
- 不要在
unset DBUS_SESSION_BUS_ADDRESS后单独启动 fcitx5 —— 会导致桌面总线 D-Bus 自动激活第二个实例争抢 XIM(双实例坑),输入法失灵。 - 取总线地址必须遍历所有 ukui-session 进程:
pgrep -x ukui-session | head -n1会命中没有DBUS_SESSION_BUS_ADDRESS的进程,导致取不到地址;等待循环超时后 fcitx5 又会在无总线状态下启动(坑会复发)。 DisabledAddons=notificationitem在本 openEuler 5.1.12 构建中不生效(运行时仍加载 notificationitem 插件);托盘图标由该插件(SNI)提供,本机 SNI 未注册故实际无托盘图标。- “Fcitx5 Input Window” 是候选词窗口,不是托盘,不要误当作托盘去禁用。
- 诊断命令需要
DISPLAY=:1和桌面DBUS_SESSION_BUS_ADDRESS,否则 fcitx5-remote/dbus-send 报Failed to create dbus connection。 - 窗口排查依赖
xwininfo(已安装:dnf install -y xwininfo);fcitx5-diagnose可检查插件与输入法配置。 - 默认输入法为五笔拼音
wbpy(profile:DefaultIM=wbpy),码表位于/usr/share/libime/wbpy.main.dict。
7. 附录:关键文件与常用诊断命令
| 文件 | 作用 |
|---|---|
/root/.vnc/xstartup |
VNC 会话启动脚本(等待会话总线 + 启动 fcitx5) |
~/.config/fcitx5/config |
fcitx5 全局配置(热键、[Behavior]、DisabledAddons) |
~/.config/fcitx5/profile |
输入法组与默认输入法(DefaultIM=wbpy) |
/usr/share/fcitx5/addon/notificationitem.conf |
托盘(SNI)插件定义 |
/usr/share/libime/wbpy.main.dict |
五笔拼音码表 |
常用诊断命令速查:
# 进程 / 环境
ps aux | grep -E 'fcitx|Xvnc'
pgrep -a -x fcitx5
tr '\0' '\n' < /proc/<fcitx5-pid>/environ | grep -E 'DISPLAY|DBUS_SESSION_BUS_ADDRESS|XMODIFIERS'
# 会话总线
pgrep -a dbus-daemon
ls -la /tmp/dbus-*
# 输入法诊断 / XIM / 运行时插件加载
DISPLAY=:1 fcitx5-diagnose
xprop -root | grep XIM_SERVERS # 应含 @server=fcitx
grep -c libnotificationitem /proc/<fcitx5-pid>/maps # 0 = 插件未加载
# 切换测试(需先 export DISPLAY=:1 与桌面总线地址)
fcitx5-remote -s wbpy; fcitx5-remote -n # 应输出 wbpy
fcitx5-remote -s keyboard-us; fcitx5-remote -n # 应输出 keyboard-us
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)