-
-
[原创]自己动手修改mac百度输入法的一个问题
-
发表于:
2017-3-30 15:44
6121
-
Mac百度输入法修正过程
在苹果系统上,百度输入法还算是不错的。由于个人原因,面对电脑的主要时间还是在输入代码,所以主要输入的还是英文,而不是中文。输入英文可以两种方式,一种是包括百度在内的大多数输入法支持按shift切换状态,这适合输入中文中夹的一些英文词,或短时间使用。另一种就是直接切到英文输入法状态,这更适合类似输入代码这样的长时间使用行为。
可是,百度输入法有个比较严重的bug。在shift切换到的百度英文输入状态下,如果切换到另一个使用直接英文的窗口,再切换回来,shift状态就会丢失,输入的会是中文。当我一堆程序是英文,一堆是百度,一切换百度的输入状态,所有用百度的进程全变中文,搞得我很多时候想输入英文却在中文状态,工作思路被打断,很恼火。
要解决这一bug,第一个想法自然是反馈意见,希望官方来解决。于是我打开百度输入法设置里的反馈界面,提交意见。
不幸的是,几个星期过去了,也没有任何动静。这是可以理解的,估计这些反馈消息,根本没有人看。百度现在正换着高管,也不知道有没有影响到员工们的工作心态。
既然百度指望不上,那就自己动手吧。
首先搞了个小APP来调试,发现APP没有加载任何百度相关的dylib。这说明mac跟windows对输入法的套路不一样,windows输入法都是直接加载到进程里的,而mac是通过IPC请求来输入的。windows的好处是效率高,而mac的好处是安全隔离。由于输入法本身不需要追求那么高的效率,所以这一点上,mac胜。
呃,说远了,说回来。既然不加载dylib,那就找进程呗。很容易就找到了:
呃,怎么会在临时目录里呢?去文件系统上找找。发现在 /Library/Input Methods/BaiduIM.app下。看来是系统拷过去的。
接下来就是lldb attach调试结合ida反汇编。找到了按shift切换中英文的逻辑所在
也就是说,在应用程序中按下按键时,百度会收到 handleEvent:client:事件,然后如果是shift,就切换中英文。同时也可以在这个函数的反汇编中看到,client参数并没有用起来,所以百度根本没有区分当前是哪个进程要输入文本,shift的中英文切换是全系统共用的。如果所有程序一起用百度输入法,要输英文就按shift,这样可能会稍微好用一点,但这种方法对我是不适合的。
在切换处下断,继续使用其它功能,发现还有两个情况会引发中英文切换。一个是从开着百度输入法的程序切换到没开的程序时:
此时系统会调用hidePalettes方法,来隐藏百度已经显示的一些输入法浮条。百度就乘机切换到中文状态(什么鬼?)。
另一个是从没开百度的程序切到开着百度的程序时:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课