问题现象

在 Arch Linux、KDE Plasma Wayland 和 Fcitx5 环境中,出现了一个很奇怪的输入法问题:

  • Brave 等部分原生 Wayland 应用中可以输入文字;
  • 但中文、英文、日语之间的输入状态无法正常切换,或者状态显示与实际输入不一致;
  • 关闭并重新打开浏览器,问题依旧可能存在;
  • 系统重启后问题稳定复现。

更奇怪的是,某次调整 Waydroid 独立窗口模式并启动 Android 应用时,整个桌面环境发生崩溃。Plasma 和 KWin 恢复后,原本无法正常切换输入状态的应用突然全部恢复正常。

随后正常关闭并重新打开 Brave,输入法仍然正常。但整机重启后,问题又重新出现。

这个现象提供了一个很重要的线索:

问题不是浏览器进程本身的临时状态,而更可能发生在 KDE Plasma Wayland 会话启动阶段。


最初的判断

由于桌面崩溃后输入法恢复,而浏览器重启后仍然保持正常,可以初步排除:

  • Brave 自身缓存损坏;
  • 单一应用的输入法配置异常;
  • 中文或日语输入引擎损坏;
  • Waydroid直接修复了输入法。

更合理的解释是:

  1. Waydroid 触发了 KWin 或整个 Plasma 图形会话重建;
  2. Fcitx5、KWin 和应用之间的 Wayland 输入法连接被重新初始化;
  3. 原先错误的启动顺序或连接状态被清空;
  4. 新建立的输入法链路暂时恢复正常。

但这仍然只是推测,需要日志和配置证据进一步验证。


只读排查

为了避免继续扰动系统,首先进行了严格的只读审计,没有修改配置、没有重启进程,也没有重新运行 Waydroid。

重点检查了以下内容:

  • 当前存在多少个 Fcitx5 主进程;
  • Fcitx5 的父进程与启动来源;
  • KWin 是否配置了 Fcitx5 Wayland Input Method;
  • 是否还存在传统 XDG Autostart;
  • systemd 用户服务中是否有额外启动路径;
  • Brave 使用的是 Wayland 还是 XWayland;
  • 当前启动和上一次桌面崩溃前后的日志时间线;
  • D-Bus 中 org.fcitx.Fcitx5 名称的持有情况。

最终发现,系统中同时存在两条 Fcitx5 启动路径。


第一条启动路径:KWin Wayland Input Method

KDE Plasma Wayland 中,Fcitx5 被配置为 KWin 的输入法组件,KWin 使用类似下面的 desktop 文件启动它:

/usr/share/applications/fcitx5-wayland-launcher.desktop

实际启动命令为:

fcitx5-wayland-launcher --reopen

这种方式是 KDE Plasma Wayland 下较合适的启动方式,因为 KWin 需要把 Fcitx5 作为 Wayland 输入法客户端管理,并建立原生 Wayland 输入协议连接。


第二条启动路径:传统 XDG Autostart

与此同时,系统软件包还提供了传统自启动文件:

/etc/xdg/autostart/org.fcitx.Fcitx5.desktop

这个文件会在桌面登录时再次尝试启动普通 Fcitx5 实例。

于是冷启动时出现了类似下面的顺序:

  1. KWin 先通过 Wayland launcher 启动 Fcitx5;
  2. 第一个 Fcitx5 成功取得 D-Bus 名称:
org.fcitx.Fcitx5
  1. Plasma 的传统 XDG Autostart 随后又尝试启动第二个 Fcitx5;
  2. 第二个实例发现 D-Bus 名称已经被占用;
  3. 第二个实例报错退出:
Unable to request dbus name
Is there another fcitx already running?

从最终进程数量看,系统里可能仍然只剩一个 Fcitx5 主进程,因此这个问题很容易被忽略。

真正的问题并不是长期存在两个 Fcitx5,而是:

登录阶段发生了第二次实例启动尝试,引入了初始化顺序竞争。

这种竞态可能影响:

  • KWin Virtual Keyboard 所有权;
  • Fcitx5 Wayland socket;
  • D-Bus 注册顺序;
  • Chromium 的 Wayland 输入上下文;
  • text-input-v3 协议初始化;
  • 应用首次获得输入焦点时的状态同步。

为什么 Waydroid 崩溃后会恢复

日志时间线显示,Waydroid 事故发生后,并不是某一个输入法进程被简单重启,而是整套图形链路发生了重建:

  • KWin 崩溃并重新启动;
  • Plasma 相关组件重新建立;
  • Brave 旧进程与 Wayland 合成器断开;
  • 原 Fcitx5 实例退出;
  • 新的 Fcitx5 重新取得 D-Bus 名称;
  • 应用重新连接 Wayland 会话;
  • 输入法上下文重新初始化。

因此,Waydroid并没有直接修复 Fcitx5。

它只是意外触发了一次比“关闭浏览器”更彻底的图形会话重置,使 Fcitx5、KWin 和应用重新建立了正确连接。

这也解释了为什么:

  • 桌面崩溃后问题消失;
  • 浏览器重启后仍然正常;
  • 整机冷启动后问题再次出现。

修复方案

不建议删除系统文件:

/etc/xdg/autostart/org.fcitx.Fcitx5.desktop

因为它属于软件包管理范围,在其他桌面环境或 X11 环境中可能仍然有用途。直接删除还会导致软件包完整性检查报告文件缺失,并且软件升级后可能再次恢复。

更合适的方法是使用 XDG Autostart 的用户级覆盖机制。

创建用户级同名文件:

~/.config/autostart/org.fcitx.Fcitx5.desktop

内容如下:

[Desktop Entry]
Type=Application
Name=Fcitx 5
Hidden=true

这个文件的作用是:

  • 保留系统级 autostart 文件;
  • 仅对当前用户屏蔽传统启动路径;
  • 不影响软件包管理;
  • 不修改系统配置;
  • 以后需要回滚时,只需删除用户级覆盖文件;
  • KWin Wayland launcher 仍然保持正常工作。

需要注意,用户级文件名必须与系统级文件名完全相同,XDG Autostart 覆盖机制才会生效。


单变量 A/B 测试

为了确认双启动是否真的是根因,只进行了一项配置变化:

  • 保留 KWin Wayland Input Method;
  • 保留系统级 autostart 文件;
  • 只加入用户级 Hidden=true 覆盖;
  • 不修改其他 Fcitx5、KWin、Brave 或 Wayland 配置。

重启系统后,结果非常明确:

  • 所有原本无法切换输入状态的应用全部恢复正常;
  • 中文、英文、日语状态均可正常切换;
  • 实际输入与状态显示一致;
  • Brave 关闭后重新打开仍然正常。

随后进行了只读核验。


修复后的验证结果

修复后的系统状态为:

1. 只有一个有效 Fcitx5 主实例

系统中不再出现第二个普通 Fcitx5 启动尝试。

2. Fcitx5 由 KWin 启动

当前实例来自:

fcitx5-wayland-launcher --reopen

KWin 仍然指向:

/usr/share/applications/fcitx5-wayland-launcher.desktop

3. 传统 autostart 不再执行

对应的用户级 autostart service 不再生成或启动。

4. D-Bus 名称竞争消失

当前启动日志中不再出现:

Unable to request dbus name

也不再出现:

Is there another fcitx already running?

5. Wayland 输入法协议正常

唯一有效的 Fcitx5 实例正常持有:

org.fcitx.Fcitx5

并正常使用 Wayland native input method protocol。


最终结论

通过日志分析、配置审计、单变量修改、系统重启和修复后核验,可以确认:

KDE Plasma Wayland 下的输入法状态切换故障,是由 KWin Wayland Input Method 与传统 XDG Autostart 两条 Fcitx5 启动路径并存造成的。

传统 autostart 在冷启动阶段触发了第二个 Fcitx5 实例启动尝试,虽然第二个实例最终因 D-Bus 名称冲突而退出,但这一过程扰乱了输入法初始化顺序,导致部分原生 Wayland 应用中的输入状态异常。

使用用户级同名 desktop 文件设置:

Hidden=true

屏蔽传统 autostart 后,系统只保留 KWin Wayland launcher 路径,重复实例竞争消失,所有受影响应用恢复正常。


不需要继续深挖的部分

现有证据已经确认第二条传统 autostart 路径是故障的因果来源。

至于底层瞬间究竟发生在:

  • D-Bus 名称竞争;
  • Wayland socket 初始化;
  • KWin Virtual Keyboard 所有权;
  • Chromium text-input-v3 状态同步;
  • 应用首次焦点进入时的输入上下文注册;

目前没有必要继续细分。

从系统维护角度,根因已经确认,修复方案已经通过重启验证,不需要再通过制造崩溃或反复重启输入法进行实验。


维护建议

后续应保持以下状态:

~/.config/autostart/org.fcitx.Fcitx5.desktop
[Desktop Entry]
Type=Application
Name=Fcitx 5
Hidden=true

同时避免:

  • 删除系统级 Fcitx5 autostart 文件;
  • 再创建额外的 Fcitx5 systemd 用户服务;
  • 在 shell 配置中手动执行 fcitx5 -d
  • 同时启用多个 Fcitx5 自启动机制;
  • 使用 Waydroid 或 KWin 崩溃作为输入法恢复手段。

这次故障也说明,在 Wayland 环境中,输入法能否正常工作,不仅取决于配置文件内容,还高度依赖合成器、D-Bus、桌面自启动与应用输入协议之间的初始化顺序。

Leave a Reply

Your email address will not be published. Required fields are marked *