scroll 下,linuxqq-nt-bwrap 中,fcitx5 输入中途按 esc 取消,无法清除 preedit

如题。

版本:

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)

跟这个 Electron应用中fcitx5退出输入时进入异常状态 有关吗

应该是同一个问题,那感觉没辙啊。

但 KDE 为什么没问题?有没有什么 workaround 啊?

除了patch应用或合成器感觉没啥其他方法。kde不知道,或许你抓一下wayland debug日志看看它怎么弄的。不会是发了个空的zwp_text_input_v3::preedit_string吧..

要么就给preedit关了((反正我是从不开这个的

我的建议是移除 flags 让 linuxqq 用 xwayland,去和隔壁完全不支持 wayland 的难兄难弟 wechat 坐一桌(

刚刚 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() > 0ic_->setPreeditString 不会执行,导致清空的 preedit 没有同步上去。

Deepseek 这样说的,去除 > 0 特判后,试了一下感觉可行。

倒也是个方法。原来“清空preedit只发done”的逻辑也是输入法层面来做的。之前Minecraft也有这个问题,我竟没想到去直接patch ime。不过本质上其实还是应用的问题罢了。

git blame 看了一下此判断于 commit 4fa77572 引入,并标记为 fix #514,因此这个判断的存在是有意义的。要不去 fcitx5 提个 issue 问问?

问问也问不了什么。根据那个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我大概测试了下感觉也没发现引入新问题,或许可以建议下。