桌面概率长按键盘无法连续输入问题

**问题描述:**概率性长按键盘无法连续输入文本

问题定位:

  1. 系统按键流程分析

图一 系统按键流程

  1. 按键是由X Server接收的,这一点只要明白了X Window的工作机制就不难理解了。
  2. X Server在接收到按键后,会转发到相应程序的窗口中。在窗口的处理函数中,可以选择是否响应按键等,这里假定窗口是可输入的。
  3. 这时窗口将收到的按键回传给X Server,询问X Server关于XIM Server的相关信息。倘若输入法是打开的。
  4. X Server会将事件发送给XIM Server(也就是输入法)去处理。XIM Server通过某种方式(例如,查码表)将按键转换成特定的字符串
  5. 之后返回给X Server
  6. X Server得到字符串后,再通知窗口输出字符串。
  1. 搜狗输入法输入法介绍
  1. 搜狗输入法CS 模型

图二 搜狗输入法CS模型

  1. fcitx输入法框架接受到按键事件传给注册的fcitx搜狗输入法模块即sogouimeclient
  2. Sogouimeclient通过sogouIPC传给sogouimeservice,soouimeservice收到消息处理完后返回消息给sogouimeclient
  1. 搜狗输入法按键流程

图三 搜狗输入法按键流程

现场测试:验证发现出现这种情况时是开了多个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