前言
这次踩坑的核心不是单个软件坏了,而是 RustDesk 远程输入、KDE Wayland 虚拟键盘(InputMethod)、Fcitx5 三者在同一个 Wayland 会话里发生了冲突。
一句话先说结论:
-
KDE 的"虚拟键盘"必须选"无"
-
不能选 fcitx5-wayland-launcher
-
一旦在 KDE 里把虚拟键盘设置成 Fcitx5,RustDesk 远程键盘输入就会出问题
-
最终正确方案是:全局关闭 KDE 虚拟键盘,Edge 和 VSCode 单独走 XWayland + fcitx
如果下次我重装系统,只要看到这篇记录,我就知道怎么修。
我的环境
-
系统:LMDE 7 (gigi)
-
桌面:KDE Plasma 6
-
显示协议:Wayland
-
输入法:Fcitx5 + Rime
-
远程桌面:RustDesk 1.4.6 (deb)
-
浏览器:Microsoft Edge
-
编辑器:VSCode
问题现象
最开始的现象非常诡异:
-
RustDesk 能连上,但远程输入键盘时异常
-
表现像是 Insert 一直被按住
-
在编辑器或终端里输入时,会进入 覆盖模式(Overwrite)
-
本地终端中文输入正常
-
Chrome 可以输入中文
-
Edge 和 VSCode 则时好时坏,或者完全不能输入中文
最后排查下来,问题根源是 KDE Wayland 的虚拟键盘设置。
核心矛盾
在 KDE Plasma 6 + Wayland 下:
-
如果 系统设置 -> 输入设备 -> 虚拟键盘 里选择了 fcitx5-wayland-launcher
-
Edge 中文可能正常
-
VSCode 中文可能正常
-
但 RustDesk 远程键盘输入会坏
-
典型症状就是 Insert 卡住、覆盖输入、按键状态异常
-
如果 虚拟键盘 选择 无
-
RustDesk 远程输入恢复正常
-
终端中文正常
-
但 Edge / VSCode 这种应用,默认 Wayland IME 可能又不能用
所以本质上是两套输入链路打架:
-
RustDesk 依赖远程注入键盘事件
-
KDE Wayland InputMethod 会接管输入法协议
-
Fcitx5 再参与虚拟键盘输入
-
三者叠加后,键盘状态容易错乱
最终结论
最关键的一条:KDE 的虚拟键盘必须设为"无"。
也就是:
-
打开 系统设置
-
进入 输入设备
-
找到 虚拟键盘
-
选择"无"
-
不要选择 Fcitx 5 Wayland Launcher
-
不要选任何输入法项
-
只要这里选了 Fcitx5,RustDesk 就会坏
这条是全篇最重要的结论。
最终可用方案
我最后采用的是下面这套组合,全部都能共存:
-
KDE 虚拟键盘:无
-
RustDesk:正常
-
终端 Fcitx5:正常
-
Chrome 中文:正常
-
VSCode 中文:正常
-
Edge 中文:正常
实现方式分两层:
- 全局层
-
关闭 KDE 虚拟键盘
-
清理全局 IME 环境变量
-
不让系统全局强推 Wayland IME
- 应用层
-
Edge 和 VSCode 不再走原生 Wayland IME
-
单独改成 XWayland/X11 + fcitx
第一步:关闭 KDE 虚拟键盘
这一步最关键。
如果你打开过 ~/.config/kwinrc,里面通常会有类似内容:
InputMethod[$e]=/usr/share/applications/fcitx5-wayland-launcher.desktop
必须去掉它,或者在 KDE 设置界面里直接改成 无。
我的最终状态是:
-
~/.config/kwinrc 里没有 InputMethod
-
KDE 图形界面里"虚拟键盘"显示为 无
这一步完成后:
-
RustDesk 输入恢复正常
-
不再出现 Insert 卡住 / 覆盖输入
第二步:清理全局输入法环境变量
我之前的一个误区,是把 GTK_IM_MODULE 和 QT_IM_MODULE 全局设置了。
比如 /etc/environment 里曾经写成这样:
export GTK_IM_MODULE=fcitx5
export QT_IM_MODULE=fcitx5
export XMODIFIERS="@im=fcitx5"
这其实不适合当前这个场景。
最终正确做法是:
XMODIFIERS=@im=fcitx5
注意两点:
-
/etc/environment 里不要写 export
-
不要全局设置:
-
GTK_IM_MODULE=fcitx5
-
QT_IM_MODULE=fcitx5
用户级配置也一样,我最后的 ~/.config/environment.d/fcitx5.conf 只保留:
XMODIFIERS=@im=fcitx5
这样做的目的是:
-
全局环境尽量干净
-
不再强迫所有应用走同一条输入法链路
-
避免继续放大 RustDesk + KDE InputMethod + Fcitx5 的冲突
第三步:VSCode 单独改成 XWayland + fcitx
在 KDE Wayland 下,VSCode 不一定能直接用 Fcitx5,所以要单独处理。
我的做法是:
-
复制系统的 code.desktop 到本地
-
修改本地启动器
-
强制 VSCode 走 X11/XWayland
-
同时只对 VSCode 注入 fcitx 环境变量
~/.config/code-flags.conf 最终写成:
--disable-gpu
--ozone-platform=x11
另外,本地 code.desktop 和 code-url-handler.desktop 的 Exec 也改成类似下面这种:
env GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx5 /usr/share/code/code --ozone-platform=x11
处理完之后:
-
VSCode 中文输入恢复正常
-
RustDesk 不受影响
第四步:Edge 单独改成 XWayland + fcitx
Edge 和 VSCode 类似,但更坑一点。
因为系统里通常不止一个 Edge 启动器,至少可能有这两个:
-
microsoft-edge.desktop
-
com.microsoft.Edge.desktop
我一开始只改了一个,结果发现 edge://version 里仍然显示:
--ozone-platform=wayland
说明实际启动的不是我改的那个入口。
后来排查才发现:
-
菜单、任务栏、默认浏览器关联,很可能实际走的是 com.microsoft.Edge.desktop
-
所以必须 两个都改
最终我的做法是:
-
在 ~/.local/share/applications/ 下覆盖:
-
microsoft-edge.desktop
-
com.microsoft.Edge.desktop
-
把里面的 Exec= 全部改成 XWayland + fcitx
类似这样:
/usr/bin/env GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx5 /usr/bin/microsoft-edge-stable --ozone-platform=x11
改完之后再完全退出 Edge,重新从菜单启动,检查 edge://version,命令行里应该变成:
--ozone-platform=x11
这样 Edge 中文输入就恢复了。
为什么 Chrome 没那么麻烦
Chrome 在我的环境里,本来就能通过 Wayland 参数正常使用中文输入,所以它不一定需要退回 X11。
也就是说,这个坑主要集中在:
-
RustDesk
-
KDE Wayland 虚拟键盘
-
Fcitx5
-
Edge
-
VSCode
而 Chrome 的兼容性相对更好一些。
最终状态
我最终机器上的状态如下:
| 功能 | 状态 | 说明 |
|---|---|---|
| RustDesk 远程输入 | ✅ 正常 | 前提是 KDE 虚拟键盘必须为"无" |
| 终端中文输入 | ✅ 正常 | Fcitx5 + Rime 正常 |
| Chrome 中文 | ✅ 正常 | 本身可正常工作 |
| Edge 中文 | ✅ 正常 | 改成 XWayland + fcitx 后恢复 |
| VSCode 中文 | ✅ 正常 | 改成 XWayland + fcitx 后恢复 |
| RustDesk 开机自启 | ✅ 正常 | deb 版 systemd 服务 |
最关键的经验总结
如果你也遇到下面这个组合:正
-
KDE Plasma 6
-
Wayland
-
Fcitx5
-
RustDesk
那记住最重要的一条:
KDE 的虚拟键盘不要选 Fcitx5,必须选"无"。y
再说一遍:
-
虚拟键盘 = 无不
-
不要选 fcitx5-wayland-launcher
-
只要虚拟键盘选了 Fcitx5,RustDesk 基本就会出现输入异常|
然后再对 Edge、VSCode 这些麻烦应用做单独兼容:
-
不走 Wayland IME
-
改成 XWayland/X11 + fcitx
这样才是目前最稳的方案。c
适合重装系统后的速查版
如果下次重装系统,只要照着下面做就行:
-
安装 Fcitx5 + Rime
-
KDE 里把 虚拟键盘 设置成 无
-
检查 ~/.config/kwinrc,不要有 InputMethod
-
/etc/environment 只保留:
XMODIFIERS=@im=fcitx5
- 不要全局设置:c
GTK_IM_MODULE=fcitx5
QT_IM_MODULE=fcitx5
- VSCode 改成:i
-
--ozone-platform=x11
-
单独注入 GTK_IM_MODULE=fcitx
-
单独注入 QT_IM_MODULE=fcitx
- Edge 改成:
-
--ozone-platform=x11
-
同样单独注入 fcitx 环境变量x
- 注意 Edge 可能要同时改:
-
microsoft-edge.desktop
-
com.microsoft.Edge.desktop
一句话收尾.
这次问题的根源不是 Fcitx5 本身坏了,也不是 RustDesk 单独坏了,而是 KDE Wayland 虚拟键盘 和 RustDesk 的输入注入机制冲突。r
最终稳定解法就是:虚拟键盘设为"无",然后把 Edge / VSCode 单独切到 XWayland + fcitx。键