苦雨
1
如题。
版本:
sway-scroll 1.12.11-1
linuxqq-nt-bwrap 3.2.28_260429-1
设置了 ~/.config/qq-electron-flags.conf:
--enable-features=UseOzonePlatform
--ozone-platform=wayland
--enable-wayland-ime
在 chromium 以及 vscode 当然没有这个问题。
KDE 没有这个问题。但 KDE 好像有专门的 fcitx5 前端,不太可比。
fcitx5-diagnose.txt (9.9 KB)
bczhc
2
苦雨
3
应该是同一个问题,那感觉没辙啊。
但 KDE 为什么没问题?有没有什么 workaround 啊?
bczhc
4
除了patch应用或合成器感觉没啥其他方法。kde不知道,或许你抓一下wayland debug日志看看它怎么弄的。不会是发了个空的zwp_text_input_v3::preedit_string吧..
要么就给preedit关了((反正我是从不开这个的
我的建议是移除 flags 让 linuxqq 用 xwayland,去和隔壁完全不支持 wayland 的难兄难弟 wechat 坐一桌(
苦雨
6
刚刚 vibe 问了下 Deepseek。
在 fcitx5 代码中:
// Validate not empty and within wayland limit.
if (preedit.textLength() > 0 &&
preedit.textLength() < WaylandIMServerBase::safeStringLimit) {
if (cursorStart < 0) {
cursorStart = cursorEnd = preedit.textLength();
}
ic_->setPreeditString(preedit.toString().data(), cursorStart,
cursorEnd);
}
ic_->commit(serial_);
其中有判断 preedit.textLength() > 0,ic_->setPreeditString 不会执行,导致清空的 preedit 没有同步上去。
Deepseek 这样说的,去除 > 0 特判后,试了一下感觉可行。
bczhc
7
倒也是个方法。原来“清空preedit只发done”的逻辑也是输入法层面来做的。之前Minecraft也有这个问题,我竟没想到去直接patch ime。不过本质上其实还是应用的问题罢了。
git blame 看了一下此判断于 commit 4fa77572 引入,并标记为 fix #514,因此这个判断的存在是有意义的。要不去 fcitx5 提个 issue 问问?
bczhc
9
问问也问不了什么。根据那个bug我猜是之前的fcitx5在非composing状态下按键也会发set_preedit_string,导致按ctrl+A时一并发送了空的set_preedit_string,继而根据协议规定,应用会把所选内容清空,从而导致了514这个bug。但我测试了,现在版本的fcitx5已不会在非composing状态时按键(例如按Ctrl+A)发送set_preedit_string,所以现在这样patch fcitx5就没产生其他问题。fcitx5的实现也没问题,这几个协议本身就是双缓冲,在commit或done之前都是需要把state置成初始值的。我目前也只在真实世界中遇到了Minecraft 26.2快照以及就是这个electron版本一直不升级的qq。不过既然fcitx5那个bug没了,而且恢复发送空的set_preedit_string我大概测试了下感觉也没发现引入新问题,或许可以建议下。