|
发表于 2003-7-4 18:31:22
|
显示全部楼层
回复: 回复: 输入法崩溃问题
X Server, X lib 和 XIM 机制本身是没有问题的。问题出在 Input Server 和 Client 上面。
Input Server 如果没有正确处理 Clients 异常退出的情况,可能导致自己崩溃。Client 也是同样的道理。主要错误类型其实就是 BadWindow。如果 Client 突然退出了,其窗口当然也就销毁了,如果这个时候 Input Server 再向这个 client 窗口发送输入,就会触发 BadWindow 错误,极有可能导致 Input Server 退出。反之也是类似的。
不过 XIM 和 X lib 其实提供了机制来避免这种问题,只是很多程序没有使用罢了。
最初由 stormful 发表
我想这应该是个很好的问题。以前我在FreeBSD下使用fcitx 1.8.4的时候,就曾经遇到这个问题。但是倒不是fcitx异常退出了,而是我把它kill了。当时我的X下的控制台倒是没有异常退出而是没有响应了。
对于x11所说的情况就有点难于理解了。怎么会哪?fcitx和使用fcitx服务的程序是不同的进程。他们之间不存在直接的联系,他们通过XIM协议来通信。如果出现了这种情况,我想他们在XIM协议的客户端的实现上有问题。如果他们使用了IMkit,那么有可能是IMkit的问题。如果说这些程序没有响应了,我想这是正常的。
当然了,呵呵,fcitx最好不要异常退出。我个人还没有仔细研究过XIM的实现问题。XIM是否能够unregister?如果能的话,就可以保证操作系统的稳定性。
以下的内容是我对XIM的某些推测:
当在环境变量中指定某种输入法后。每当那些支持XIM的程序启动的时候,X Server都会为他们和建立一个连接。这种连接的形式我还没有搞清楚。是X Server->input server->client还是input server<->client。我感觉后者的可能性比较大。建立连接后,client上输入的每个字符都会通过input server。并由input server来解释最终的结果,包括ctrl+space这样的输入。然后,client才获得实际的结果。当我键入killall fcitx回车时,回车字符再也不会回来了。因为fcitx已经被kill了。因此我的控制台没有响应了,因为它还在等那个回车字符回来。但我感觉很奇怪,既然时ICE连接,而且这东西基本上时基于TCP的,为什么没有超时哪?时client没有识别这方面的能力还是X Server没有管理这方面内容的能力?呵呵,看了还要再研究研究。 |
|