TabIMSwitch 1.1.0.32
一边骂微软的输入法标准,一边还要继续完成我一直想做的几个feature,其中之一就是能够更加细致的控制输入法的状态,类似半角/全角的东西。
因为上文所说的原因,所以最后用了IMM,虽然功能不够多,而且不保证能够完全的控制微软拼音和日文Natural IME,但是基本上够用了。
接下来打算研究一下TSF,似乎有点意思。
一边骂微软的输入法标准,一边还要继续完成我一直想做的几个feature,其中之一就是能够更加细致的控制输入法的状态,类似半角/全角的东西。
因为上文所说的原因,所以最后用了IMM,虽然功能不够多,而且不保证能够完全的控制微软拼音和日文Natural IME,但是基本上够用了。
接下来打算研究一下TSF,似乎有点意思。
有感于微软的文字输入法的标准:
Windows 95/98/NT4: Advanced Input Method Manager
Windows 95-XP: IMM
Windows XP以上: Text Services Framework
Windows 2000兼容Windows 98的IMM架构,也有有限的TSF支持。
Windows XP下面默认使用的是TSF,IMM仍然可用,但是功能有限。
Vista下面?不知道,也许和XP差不多。
而且,TSF基于COM,如果我要用了这个模型的话,这可真是个大杂烩了。
也许搞定了之后,我可以有机会弄清楚当XPCOM和COM并存,程序会变成什么样子。
![]()
在做TabIMSwitch的新版本的时候,彻底被微软的输入法体系搞郁闷了。
我现在有两个可用的Windows XP系统,一个是我的笔记本,XP Pro 中文版,一个是公司的机器,XP Pro英文版,两台机器都单独装了微软拼音2003(公司因为Office是英文,默认不带微软拼音;笔记本因为不愿用盗版,所以只装了Viewer,也要单独装微软拼音)。本来这个应该非常常见的情况,可是在测试TabIMSwitch的时候被彻底的搞郁闷了。
这个新版本的目的主要是为了解决smth上面有网友提出说不希望自动添加英文Locale。之前我做了一个TabIMSwitch 1.1.0.1的内部版本,这个在我的中文系统上面工作的很好。但是网友回复说仍然不能工作,后来调查之后发现可能是因为英文系统的缘故。然后果然在公司的英文XP上面重现了出来。从目前的情况来看,可能的结果就是在英文XP系统上面带有的微软拼音2003都无法支持,如果不想自动添加英文Locale的话。
造成这个问题的原因很有意思,说起来应该从TabIMSwitch的工作方式开始。
TabIMSwitch的工作机理很简单:TabIMSwitch由两个主要的部分,一个是前端的content\firefoxOverlay.xul及其带有的一批js文件,另一个就是用C++写成的XPCOM组件,位于src\tabimswitch目录下面。两者之间通过Firefox的XPConnect机制联系。XPCOM最初做的很简单,只是封装了一下Windows的KeyboardLayout的系列函数。当Firefox启动之后,会自动加载XPCOM组件和前端的xul文件,并且在xul当中进行必要的消息的hook。当TabIMSwitch发现当前的标签页发生了变化的时候,就会获取到Firefox当前的输入法状态,并将其存入到一个列表当中,然后从这个列表当中获取即将切换到的标签页的输入法(以前保存下来的),并且将其设置成Firefox的当前输入法。
问题在于,微软关于输入法的说明非常的零散,不过基本上围绕在Keyboard Layout和IME两节当中。根据文档的描述,微软拼音输入法和“中文-美式键盘”之间的区别就在于它们是不同的Keyboard Layout。因此,只要存下来这个Keyboard Layout就OK了。TabIMSwitch 1.0.*系列也是这么实现的。
但是就是这种简单的实现在英文版XP+微软拼音输入法上面不工作,经过跟踪之后发现,原因竟然在于,在这种环境下面微软拼音和“中文-美式键盘”之间是完全相同的:无论通过GetKeyboardLayout函数还是GetKeyboardLayoutName函数,得到的都是相同的Keyboard Layout。当时在1.0.*系列当中为了解决这个问题,就自动Load了一个04090409的Keyboard Layout,也就是“英文-美式键盘”,来避免和微软拼音的冲突。所以就有了前面网友提出的那个问题。
后来考虑是不是可以通过IME接口来对输入法进行更加细致的控制,结果非常无奈:似乎对于IME接口来说,微软拼音和“中文-美式键盘”也是相同的。我找到了微软MSDN当中提供的一个sample,揭示了IME接口的使用方式。但是就使这个示例程序,在我的英文XP下面也歇菜了。
目前只能说:完全被微软自己的两个东西搞疯掉了。
TabIMSwitch被收录在addons.mozine.cn上面了。
http://addons.mozine.cn/firefox/610/
昨天被管理员添加进去的,今天已经有了73下载量,和之前在googlecode上面的累积量差不多。
hoho
接下来对于TabIMSwitch还有一些东西需要实现,一些是现在不具有的功能,一些是现在已知的一些问题。
大体上能够想得到的就这么多。还有就是找一个托管的地方把代码放上去,正在考虑sourceforge还是google code……
update:
最后选定使用Google Code,原因之一是有人说Google Code起步比较容易,不像sourceforge需要填一大堆的表格;原因之二是对于Google的好感
。
TabIMSwitch将使用BSD Lisence发布,不使用GPL的原因可以写一篇很长的blog,这里地方太小,写不下。
项目主页:http://tabimswitch.googlecode.com
我期望当中的小东西终于可以工作了,因为目前只在我的XP SP2+FF2.0上面测试通过,而且我的两个FF版本一个干净的什么都没有,一个插件成堆,不敢保证兼容性,先暂时带着一个Alpha好了。用Firefox并且在Windows下面的朋友们帮我测试一下。
如果你已经在使用Firefox了,可以点击安装插件。安装并重启Firefox之后,在地址栏输入
chrome://tabimswitch/content/testing.xul
然后回车,会看到一个很简单的页面,这个页面是用来检测后台的模块是否正确的注册给了Firefox。点击上面的“Show current”,如果弹出来这样一个窗口,那么表明这个东西基本可以workHTML了,如果你碰巧和我一样在用微软拼音,点点另外两个试试看好了。
接下来你需要做的,就是尽情的在各个标签页之间切换,然后感受一下不同的标签页能够具有不同的输入法的好处吧。![]()
如果遇到什么bug,或者有什么新的建议,在这里留言,或者发信到下面两个邮箱:
zhangc AT ustc.edu
ftofficer.zhangc AT gmail.com
垃圾邮件很多,所以标题要容易理解一点……
OK,这也算是我曾经写过的帖子的后续吧。