首页
社区
课程
招聘
[原创]自己动手修改mac百度输入法的一个问题
发表于: 2017-3-30 15:44 6129

[原创]自己动手修改mac百度输入法的一个问题

2017-3-30 15:44
6129

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方法,来隐藏百度已经显示的一些输入法浮条。百度就乘机切换到中文状态(什么鬼?)。

另一个是从没开百度的程序切到开着百度的程序时:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
为啥不把PDF的文章直接帖到论坛上?
2017-3-30 19:09
0
雪    币: 216
活跃值: (370)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
改好了。
2017-3-31 13:42
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
goldenegg 改好了。
谢谢,顺便测试一下回复提醒,你应该收到了一个消息提醒。
2017-3-31 13:44
0
雪    币: 216
活跃值: (370)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
kanxue 谢谢,顺便测试一下回复提醒,你应该收到了一个消息提醒。
刚刚没有收到提醒消息,顺便也帮忙找出了bug原因:我可能是因为以前老版本论坛就登录了,切换到新版本论坛没有重新登录。发文章的模块认为我登录了,所以我能发文章。但是消息模块认为我没有登录,所以没有收到消息提醒。我重新登录了一下,就看到消息提醒了。
2017-3-31 13:52
0
雪    币: 61
活跃值: (45)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
大神v5
2017-3-31 23:03
0
游客
登录 | 注册 方可回帖
返回
//