Emacs for Windows的输入法事件修复
1. 前因后果
2. 问题描述
3. 修复过程
在事件循环里面给默认分支添加 DispatchMessage 调用就可以.
具体的代码可以看我的仓库或者上面的提交链接.
我的仓库
4. 后日谈
这个问题很复杂,需要比较了解窗口的事件循环处理逻辑, 在这之前得知道emacs的窗口事件分发是怎么样
的, emacs的窗口事件有2个线程, 一个是工作线程, 一个是输入线程.
首先在emacs的主循环代码里面, emacs是有区分msg的消息来源是工作线程还是输入线程, 通过判断
msg的hwnd是不是等于NULL, 这个很容易理解, 工作线程的事件是没有窗口句柄的. 不是NULL就会调用
DispatchMessage, 从而分发到输入线程的窗口过程事件函数.
问题就出现在这里了, 当在emacs里, 键盘上按下shift键的时候, 按照我的Windows开发经验来说,
系统分发了2个事件, 一个是键盘按下和通知IME状态的事件, 区别就在这里.
通知IME状态的事件它是没有窗口句柄的, 被误以为是工作线程事件, 给拦截住了, 导致没有把事件分发
到输入线程的窗口过程函数, 也就没有去调用默认的窗口事件处理函数. 这个问题是新版本的TSF兼容
问题.
这对于emacs来说是bug吗? 我感觉不算, 但处理的也有点问题, 光靠判断hwnd还不够, 应该要有专门
的flag去判断, 旧版本的微软拼音没有这个问题, 小狼毫等三方输入法不兼容IME也会导致这个问题.