问题描述:概率性长按键盘无法连续输入文本
问题定位:
- 系统按键流程分析
图一 系统按键流程
- 按键是由X Server接收的,这一点只要明白了X Window的工作机制就不难理解了。
- X Server在接收到按键后,会转发到相应程序的窗口中。在窗口的处理函数中,可以选择是否响应按键等,这里假定窗口是可输入的。
- 这时窗口将收到的按键回传给X Server,询问X Server关于XIM Server的相关信息。倘若输入法是打开的。
- X Server会将事件发送给XIM Server(也就是输入法)去处理。XIM Server通过某种方式(例如,查码表)将按键转换成特定的字符串
- 之后返回给X Server
- X Server得到字符串后,再通知窗口输出字符串。
- 搜狗输入法输入法介绍
- 搜狗输入法CS模型
图二 搜狗输入法CS模型
- fcitx输入法框架接受到按键事件传给注册的fcitx搜狗输入法模块即sogouimeclient
- Sogouimeclient通过sogouIPC传给sogouimeservice,soouimeservice收到消息处理完后返回消息给sogouimeclient
- 搜狗输入法按键流程
图三 搜狗输入法按键流程
现场测试:验证发现出现这种情况时是开了多个vnc远程桌面服务导致,通过反复测试测试,发现输入法在多vnc服务远程桌面情况下存在watchdog检查失败,导致误关闭/opt/sogouimebs/files/bin/sogouImeService进程,如图三所示如果sogouimeservice进程不存在,则无法回复IPC:postMessage给sogouimeclient, sogouimebsclient则不会及时反馈给app,则表现为不能连续按键。
问题解决方案:
如上代码段,pidof sogouImeService的结果在vnc下会有多个进程,之前只考虑了非vnc情况,任务多的进程是异常,所以会杀死。通过修订搜狗输入法watchdog检查逻辑,支持vnc多桌面情况解决该问题,输入法版本号为sogouimebs_2.3.0.2793_amd64.deb