法律状态公告日
法律状态信息
法律状态
2014-06-25
授权
授权
2012-03-14
实质审查的生效 IPC(主分类):G06F9/44 申请日:20110624
实质审查的生效
2012-01-25
公开
公开
技术领域
本发明涉及移动通信领域,尤其涉及Wine与安卓手机软键盘输入的整合 方法。
背景技术
以手机为代表的智能化移动终端设备既是计算机技术的一个重要发展方 向,又是一个竞争十分激烈的市场。自从谷歌公司和开放手机联盟推出 Android操作系统和基于Androuid的手机以来,很快就在世界手机市场上占 有了不小的份额,各种Android手机层出不穷,由中国移动开发并推出的 OPhone也是一种Android手机。
所谓Android操作系统,实际上是对Linux操作系统的一种改编和扩充, 它的内核基本上就是Linux的内核,但是在用户空间却专门针对手机和移动 终端设备的特点作了大幅的改进和增强,这些改动大都与编程模式和图形界 面,即图形化用户界面(GUI)有关。
另一种常用于手机的操作系统是微软的WinCE和WM(Windows Mobile), 这是在微软的Windows操作系统上发展起来的。基于WinCE/WM的手机也在市 场上占不小的份额,并且开发出了数量不小的WinCE/WM应用软件。如果能把 这些应用软件拿到Android手机上运行,对于提高Android手机的市场占有 率显然是有利的。
Wine是一款优秀的Linux系统平台下的模拟器软件,用来将Windows系 统下的软件在Linux系统下稳定运行,该软件更新频繁,日臻完善,可以运 行许多大型Windows系统下的软件。当把Wine移植到ARM架构的Linux平台 上以后,WinCE/WM应用软件已经可以在Wine的支持下在采用ARM处理器的 Linux平台上运行,同样也可以在Android平台运行。
在带图形界面的Linux操作系统中,有关图形界面的功能都是由X视窗 系统提供的,输入法也是图形界面功能的一部分。运行着应用软件的进程都 不直接读取键盘输入,而只是通过进程间通信从X服务进程获取输入。人机 交互的输入先由本系统中唯一的X服务进程读取,由X服务进程统一加以前 期的处理,然后根据屏幕上光标的当前位置以及当前处于“聚焦”状态的视 窗配送给合适的进程/线程。
X视窗属于另一个开源软件项目,早在Unix时代即已存在。由于Linux 系统大多离不开图形界面,X视窗实际上已经成了Linux操作系统的一部分。 为适应手机和其它嵌入式系统的需要,人们还将X视窗加以裁剪、缩编、简 化,成为一个小型化的版本称为TinyX,所以TinyX是专门与嵌入式Linux 配对使用的X视窗系统。
然而,与常规的Linux平台不同,Android/OMS平台不使用TinyX,也不 支持依靠X视窗服务进程(Xserver)提供GUI的Linux应用。在Android/OMS 平台上,所有来自键盘和鼠标器的输入全部为一个“窗口管理器”线程所截 获,再由这个线程分发给当前正在运行的“应用(Activity)”。这样就引出 了如何整合Wine和Android/OMS的键盘输入问题。因为TinyX和Android 将会争抢来自键盘和鼠标器的输入,也会各自为政地往屏幕上画图。
为解决Wine与Android/OMS软键盘输入整合的问题,原有的中国移动的 程序模型是在运行WinCE/WM应用时,在Android也启动一个Java进程作为 Wine的代理,称为wineproxy,并使得来自键盘/鼠标器的输入统一由Android 加以截获,将其交给wineproxy,而后者将来自键盘/鼠标器的输入转发给 Xserver。通过这样一种消息传递方式,保证消息的单向流通,避免发生消息 多重传递而引发的混乱与冲突。
然而这个方案以及后来提出的验证原型,在实际上还有很多问题需要解 决,其中最重要的是在什么时候要(在屏幕上)弹出软键盘、什么时候又不应 该弹出软键盘的问题。
发明内容
针对现有技术中存在的上述问题,本发明提供了Wine与安卓手机软键盘 输入的整合方法。
本发明提供了Wine与安卓手机软键盘输入的整合方法,包括:
步骤1,当发生软键盘事件时,Wine代理向X视窗服务进程发出事件通 知;
步骤2,X视窗服务进程按照预定的格式对事件通知进行转换后,将转换 后的事件通知发送至Winex11.drv中的键盘/鼠标器输入处理程序;
步骤3,Winex11.drv将软键盘事件上交到公共控件管理模块,公共控件 管理模块决定弹出软键盘;
步骤4,X视窗服务进程将来自Wine的弹出软键盘请求转发给Wine代理, Wine代理执行弹出软件盘操作。
在一个示例中,安卓手机为Ophone手机。
在一个示例中,步骤1中,当发生软键盘事件时,调用函数Wine代理 的函数onTouchEvent()。
在一个示例中,步骤1中,Wine代理通过套接字将软件盘事件发送至X 视窗服务进程。
在一个示例中,步骤2中,X视窗服务进程将转换后的事件通知发送至 应用进程。
在一个示例中,步骤3中,应用进程中的Winex11.drv.dll将事件通知 上交至公共控件管理模块的comctl32.dll。
在一个示例中,步骤3中,comctl32.dll判断光标落在可编辑的控件中, 决定弹出软键盘。
在一个示例中,步骤3中,Winex11.drv.dll将弹出软键盘的请求发送 至X视窗服务进程。
在一个示例中,步骤4中,X视窗服务进程进行格式转换之后将弹出软 键盘的请求转发给Wine代理。
在一个示例中,还包括:
步骤5,用户按下软键盘的某个键后,调用WineProxy的函数 onTextChange();
步骤6,从TextView的缓冲区中获取键入的字符,并将其发送给X视窗 服务进程;
步骤7,X视窗服务进程将字符转发给应用进程中的Winex11.drv.dll;
步骤8,Winex11.drv.dll向应用进程发送一个WM_CHAR消息;
步骤9,应用进程接收到WM_CHAR消息;用户点击回车键或点击不可编 辑的区间,关闭软键盘。
本发明使得人机交互输入统一流经Wine服务进程(Wineserver)以及 Xserver,再由代理进程加以接收后执行弹出软键盘工作,整个过程中只有一 套输入信息的处理和配送机制,解决了Wine和Android/OMS关于软键盘输入 的整合问题,同时解决了弹出、关闭软键盘的时机与途径问题。
附图说明
下面结合附图来对本发明作进一步详细说明,其中:
图1是将Wine移植到ARM架构的Linux平台并运行WinCE/WM应用程序 时的系统的基本架构示意图;
图2是应用软键盘整合方案后的键盘输入操作的流程示意图。
具体实施方式
本发明在原有的中国移动提出的简单程序原型的基础上,加以完善和改 进,实现了一种完整的整合方案。
该方案首先切断Xserver获取软键盘的输入的途径,而在运行WinCE/WM 应用时,Android启动一个进程作为Wine的代理wineproxy,这与中国移动 的方案类似,然而这个代理必须要与Xserver通信,为此,首先建立其与 Xserver之间建立起Socket连接,并定义一组简单地通信协议。同时完善Wine 与Xserver之间的协议,并且提供一个API使得Wine可以向Xserver请求弹 出软键盘。此时,只要一发生键盘输入,Wine就向Xserver发出事件通知, 使后者将其当做内核的键盘/鼠标输入,并上交到公共空间管理层决定是否弹 出软键盘。之后Xserver将Wine的弹出软键盘请求递交给其代理wineproxy, 后者即可执行弹出软键盘操作。而当软键盘弹出后,对软键盘的按键操作也 将通过相反的消息传递通路返回,最终到达WinCE/WM应用,被其所捕获。
这个方法的要点为:
1)、在Xserver的代码中切断从内核获取键盘/鼠标器输入的途径。
2)、在Xserver和Wineproxy之间建立起一对Socket,并定义一套简 单的通信协议。
3)、对Xserver与Wine之间的通信协议加以扩充,并在Winex11.drv.dll 中增添一个API函数,使Wine可以向Xserver请求弹出软件盘。
4)、一发生键盘/鼠标器事件,Wineserver就向Xserver发出事件通知。
5)、得到来自Wineserver的事件通知后,Xserver将其当作来自内核 的键盘/鼠标器输入,转化成Xserver格式的消息后发送给Winex11.drv中的 键盘/鼠标器输入处理程序。键盘/鼠标器输入处理程序是在Winex 11.drv中 的一段根据不同输入消息类型进行分支的代码。即如果发现送来的消息是 Xserver格式的消息,则处理程序直接将其交给上层。这个输入处理程序就 是这样:
If是Xserver格式的消息,消息内容是touchEvent:
Then直接将消息交于comctl32.dll即公共空间管理
Else:其他事件,按照原有的处理代码来处理。
6)、Winex11.drv将输入上交到公共控件管理这一层,由公共控件管理 机制决定是否需要弹出软键盘。
7)、Xserver将来自Wine的弹出软键盘请求转发给Wineproxy,由后者 执行弹出软件盘的操作。
图1是按本发明中的背景的软件系统架构。图中的水平虚线表示用户空 间与系统空间的分界,虚线以上为用户空间,以下为系统空间。图中的每个 圆圈都代表着一个进程,其中最大的那个圆圈代表运行着WinCE/WM应用的那 个进程;这个圆圈分成上下两部分,表示这个进程是由WinCE/WM应用的EXE 映像和所有被(直接或间接地)动态连接到这个映像的DLL两个部分共同构成 的。除运行着WinCE/WM应用的进程之外,系统中至少还有两个进程,一个是 Wineserver,就是Wine服务器进程,另一个是Xserver,就是TinyX的服务 器进程。WinCE/WM应用进程之所以能在Linux内核上运行,是因为有 Wineserver和DLL的支持。而WinCE/WM应用进程之所以能获取键盘输入和 鼠标器输入,之所以能在屏幕上显示图形,是因为有Xserver的存在。在常 规的Linux系统中,来自键盘和鼠标器的输入全部为Xserver所截获,再由 Xserver分发给当前受到聚焦的进程。
图2是按本发明所述方法的完整结构示意图,从图中可以看到各个模块 之间仅仅通过一条链式通路相连,避免消息传递的混乱与冲突。期中Wine 与Xserver(TinyX)之间、Tinx与Wineproxy之间通过定义的socket通信协 议来相互通信。
根据整合方案,需要对代码进行以下修改:
1)、定义WineProxy的代理接口包含通信功能以及控制软键盘弹出关闭 等功能的抽象函数。
2)、具体实现这些函数,其中通信的函数中需要建立socket connection 来和Xserver通信。
3)、同样在Xserver中也定义socket connection,此时可通过自定义 的通信协议,创建一些事件,比如键盘、鼠标器等按键事件的监听器 (Listener)。
4)、在事件响应函数中将收到的事件转换格式,使得相应的应用程序能 够识别,如果是请求/关闭软键盘的事件,则通知WineProxy的弹出/关闭软 键盘操作。
5)、Xserver中加入与上层dll通信的函数,完成请求判断鼠标区域、 输入字符转发等通信任务。
通过实现上述功能后,一个完整的软键盘输入操作的流程如下:
1.使用者点击屏幕上的某个区间。
2.WineProxy的onTouchEvent()得到调用。
3.WineProxy将此事件通过socket发送给Xserver,即TinyX。
4.Xserver将此事件通知转换成X11协议所规定的格式,并将其转发给 应用进程,这个事件与Xserver获知键盘/鼠标器状态发生变化时的事件等 价。
5.应用进程中的Winex11.drv.dll接收到来自Xserver的事件后,将其 上交给上层的comctl32.dll。
6.上层DLL检查此时的光标是否落在某个可编辑的控件中,如果是就调 用Winex11.drv.dll提供的一个API函数,要求弹出软键盘。
7.Winex11.drv.dll将弹出软键盘的要求发送给Xserver。
8.Xserver进行格式转换之后将请求转发给WineProxy。
9.WineProxy弹出软键盘。
10.使用者在软键盘上按下某个键。
11.WineProxy的onTextChange()得到调用,从其TextView的缓冲区中 获取键入的字符,并将其发送给Xserver。
12.Xserver收到来自WineProxy的输入字符,将其转发给应用进程中的 Winex11.drv.dll。
13.Winex11.drv.dll向应用进程发送一个WM_CHAR消息。
14.应用进程接收到WM_CHAR消息。
15.使用者点击回车键或点击不可编辑的区间,关闭软键盘。
本发明通过采用一个统一的机制,来管理键盘/鼠标器的输入和屏幕输 出,使得TinyX和Android在软键盘按下时的不相互冲突,同时解决了在什 么时候要(在屏幕上)弹出软键盘、而什么时候又不应该弹出软键盘的问题。
以上所述仅为本发明的优选实施方式,但本发明保护范围并不局限于此。 任何本领域的技术人员在本发明公开的技术范围内,均可对其进行适当的改 变或变化,而这种改变或变化都应涵盖在本发明的保护范围之内。
机译: 使用软键盘的遥控装置,通过遥控装置输入字符的方法以及使用软键盘的显示装置
机译: 使用笔输入在软键盘上输入修改器键输入
机译: 软键盘型输入设备,输入方法,电子设备