融合与创新!openKylin虚拟键盘开发历程揭秘
随着移动端设备的不断普及,增加平板模式支持已成为桌面操作系统发展的必然趋势,因此openKylin版本在发布之初便默认支持一键切换平板模式。
不同于传统的PC设备+传统PC操作系统,移动端设备+平板模式下主要的文字输入方式为虚拟键盘而非实体键盘,因此一款好用、易用、稳定的虚拟键盘将大幅提升移动端设备+平板模式下的使用体验,但遗憾的是传统的Linux生态中一直缺少一款这样的产品。
为此,openKylin社区InputMethod SIG和Fcitx社区核心开发人员取得联系,并一起讨论分析了当前情况,最终双方决定由InputMethod SIG组主导,基于最新的Fcitx5输入法框架进行扩展,增加Fcitx5对虚拟键盘的支持,然后在此基础上再开发openKylin虚拟键盘。同时为减少国内外其他开发者的重复工作,InputMethod SIG组的技术成果也将同步提交到Fcitx社区的相关项目中去!
难点突破
在实际研发过程中,InputMethod SIG组遇到了不少技术难点需要突破,主要总结为以下5点:
01
虚拟键盘的按键事件与物理键盘的按键事件存在的本质区别;
02
Fcitx5既要允许虚拟键盘使用已有的物理键盘输入法引擎也要允许虚拟键盘使用未来专门的虚拟键盘输入法引擎;
03
Fcitx5输入法框架不能引入Qt或Gtk这种重量级UI框架;
04
虚拟键盘存在多种按键:字母键、数字键、开关键、控制键、功能键等;
05
虚拟键盘需要考虑多语言输入法。
方案确定
为解决以上难题,经过与Fcitx5社区反复分析和讨论,InputMethod SIG组决定采用以下方案分阶段各个击破。
- 一是分两个阶段实现虚拟键盘和Fcitx5输入法框架对虚拟键盘的支持。在第一期中虚拟键盘先实现跟物理键盘布局等价的UI;Fcitx5输入法框架则增加相应的虚拟键盘UI代理模块用来跟虚拟键盘UI进行通信。在第二期中虚拟键盘UI服务实现根据输入法引擎的请求显示输入法引擎自定义虚拟键盘UI;Fcitx5输入法则增加相应的虚拟键盘UI自定义模块来允许输入法引擎请求自定义的虚拟键盘UI。
- 二是虚拟键盘UI的事件不需要走传统的Fcitx5 frontend进行通信,而是跟Fcitx5中专门的虚拟键盘UI代理模块进行通信。该虚拟键盘UI代码模块的功能类似于Fcitx5中已有的kimpanel模块。
- 三是在Fcitx5输入法框架中增加新的虚拟键盘输入法引擎接口类以及虚拟键盘按键事件处理函数。在该接口中,通过动态检测当前的输入法引擎是虚拟键盘输入法引擎还是物理键盘输入法引擎来决定将虚拟键盘的按键事件发给送哪个按键事件处理函数。
- 四是虚拟键盘UI作为一个单独的服务存在,专门用于跟Fcitx5输入法框架中的虚拟键盘UI代理模块进行IPC通信。
开发历程
在确定好总体思路之后,接下来就是进行实际开发了。8月8日,InputMethod SIG向Fcitx5仓库提交了第一个PR,由此开启了Fcitx5开始提供虚拟键盘支持机制的新阶段。经过和Fcitx5作者的反复沟通,以及Fcitx5作者自己对提交的代码的修改和优化,于8月10日,InputMethod SIG提交的PR终于合并到了dev分支。
此次代码提交主要是在Fcitx5中实现了虚拟键盘UI代理模块以及打通了从dbus frontend和虚拟键盘UI代理模块之间的联系。主要实现功能如下:
- 应用程序可以通过dbus frontend提供的接口控制虚拟键盘的显示和隐藏;
- Fcitx5在收到focus in消息后自动显示虚拟键盘以及focus out消息后自动隐藏虚拟键盘;
- 虚拟键盘UI代理模块可以将虚拟键盘按键事件发送给物理键盘输入法引擎以及发送模拟按键。
不过,这次提交还缺少一个重要的功能没有实现,就是让虚拟键盘的按键事件能够跟物理键盘按键事件区分出来并且能够让虚拟键盘不仅仅使用已有的物理键盘输入法引擎,还可以使用新的专用的虚拟键盘输入法引擎。最终经过完善,在8月12日完成了最后一个PR的合并!至此,实现了Fcitx5输入法框架基本的虚拟键盘支持机制!
在Fcitx5支持虚拟键盘机制的基础之上,InputMethod SIG组采用QML和C++混合编程的方式实现了虚拟键盘UI服务。其中,C++负责提供DBus服务并实现了Fcitx5中的虚拟键盘代理模块进行双向通信的接口;QML负责虚拟键盘UI服务的界面。
展望未来
当前第一阶段的openKylin虚拟键盘输入法的开发已经完成,openKylin社区InputMethod SIG组向Fcitx社区的4个项目贡献了20多个PR近1200行代码,为开源社区的繁荣发展做出了自己的贡献!在接下来的规划中,InputMethod SIG组将进一步优化虚拟键盘支持机制,实现输入法引擎自定义虚拟键盘UI。在这个机制的加持下,虚拟键盘增加多语言输入法支持将变得更加容易!
生态建设,道阻且长。唯有开源聚力,方能行稳致远。InputMethod SIG组目标是为openKylin用户提供一个好用易用、多模、多形态、多语言的输入法,为openKylin操作系统生态建设添砖加瓦,让openKylin操作系统生态更加繁荣!
ps:想了解详细技术细节的小伙伴们可以点击 https://forum.openkylin.top/portal.php 前往openKylin论坛查看完整开发历程~
openKylin(开放麒麟)社区旨在以“共创”为核心,在开源、自愿、平等、协作的基础上,通过开源、开放的方式与企业构建合作伙伴生态体系,共同打造桌面操作系统顶级社区,推动Linux开源技术及其软硬件生态繁荣发展。
社区首批理事成员单位包括麒麟软件、普华基础软件、中科方德、麒麟信安、凝思软件、一铭软件、中兴新支点、元心科技、中国电科32所、技德系统、北京麟卓、先进操作系统创新中心等13家产业同仁和行业机构。
来源:InputMethod SIG
审核:openKylin