空管系统中键盘快捷功能的研究与实现
2012-09-17白红利
白红利
中国电子科技集团公司第二十八研究所 江苏 210007
0 引言
在空管系统当中管制员对人机界面的操作要求形象、简洁、实用,在界面设计中,键盘的快捷键功能可以很好的满足管制这方面的需求。当前空管系统的操作系统主要有UNIX、LINUX等几种,最常用的是UNIX系统,包括引进的雷神系统、马丁系统、THALES系统、TELEPHONICS系统、SkyLine系统使用的都是Solaris UNIX系统。LINUX操作系统在空管系统的应用也在逐步增加当中,而不同的操作系统对键盘快捷功能的开发都会产生影响。因此,设计一种在多个平台公用的键盘快捷功能的应用就很有必要。
1 键盘快捷功能使用的现状
现有国内外空管系统在键盘快捷功能方面各有不同。
雷神系统使用定制键盘,功能快捷键包括双排键盘支持,且键盘支持二级菜单、三级菜单键盘功能。因为雷神系统使用的鼠标是轨迹球,定位没有鼠标方便,所以主要依赖键盘的快捷功能。
马丁系统使用的是普通键盘,在功能设置使用人机界面代替,在管制操作和命令输入时依赖键盘。
TELEPHONICS系统使用的硬件平台是 SUN公司的工作站,配置的是 SUN键盘,与普通键盘存在差异。该系统主要依赖鼠标操作,键盘只提供文本输入功能,涉及键盘快捷功能少。
THALES系统使用定制键盘,比普通键盘多六个键,使用的是定制的键盘驱动。管制操作必须依赖键盘和鼠标配合操作才能完成功能。因此THALES系统在使用时不能脱离键盘的操作。
国产系统主要采用通用键盘,键盘快捷按照用户需求设置,有各地的风格。
2 键盘事件的加载
目前空管系统中,在UNIX平台上的人机界面是基于Xt开发的应用程序。Xt开发的应用程序是由事件驱动进行的,需要给目标组件注册回调函数或者给目标组件注册动作函数,执行用户定义的函数功能。注册回调函数一般用XtAddCallbacks将做好的功能函数注册到目标组件上,但注册回调函数局限于目标组件本身支持的特定的组件事件,不能满足键盘快捷功能,如果采用注册动作函数,则可以定义事件类型和修饰,实现键盘的快捷功能。
注册动作函数首先定义翻译表和动作函数,翻译表是一个对象元资源的值,指出当某一事件或者一系列事件发生时调用什么动作函数,它是一个由多个翻译项组成的字符串,翻译项把一个事件序列映射为一个或多个动作函数名,由于翻译表是一个字符串,所以 Xt需要将它转换成为自己的内部形式。翻译表的第一行可以有三种指令,它告诉转换函数如何处理现有的翻译表,三个指令是:#replace、#augment和#override。#replace指示用当前的翻译表代替旧的翻译表。#augment是合并新旧两个翻译表,当如何处理同时出现在两个翻译表中的事件时旧的翻译项优先。#override也是合并新旧两个翻译表,当如何处理同时出现在两个翻译表中的事件时新的翻译项优先。
翻译项的语法:
<修饰词表><事件>[,<事件>…]<记数>[<细节>]:<动作函数名>(<参数>)[<动作函数名>…]每个翻译表项中至少有一个<事件>,一个冒号分隔符和至少一个<动作函数名>。翻译项语法格式可以应用到资源文件、程序定义中。表1列出主要使用的键盘修饰状态。
表1 翻译表中使用的修饰词
在翻译项中还可以使用几种对事件起修饰作用的符号,表2列出修饰符号。
表2 修饰符号
翻译项中事件可以用实际名字描述,也可以使用缩写描述。表3列出与键盘快捷功能有关的事件类型。
表3 键盘事件类型
Xt没有专门提供事件缩写描述键盘哪个键按下或释放,但可以使用翻译项中<细节>描述键盘事件,键符号用来描述键盘事件<细节>,在系统头文件
3 分析多种键盘事件加载方法
键盘事件加载可以根据使用资源文件和程序控制分成四种。
使用资源文件和编程配合加载:
(1) 一类键盘符号使用一个函数接口;
(2) 一个键盘键使用一个函数接口。
完全程序控制:
(3) 所有键盘键使用一个函数接口;
(4) 一个键盘键使用一个函数接口。
3.1 使用资源文件和编程配合加载键盘事件方法
(1) 定义一个函数接口方法
在资源文件中配置:
在程序中定义3个函数:onekey(),shiftkey(),Cakey()。要在定义的函数中区分点击的键盘是哪个键。可以使用键值区分,也可以使用键符值区分。
定义的函数需要4个参数,例如:onekey(widget,event,string,cardinal)。
使用键值区分方法:在定义的函数参数中使用 event参数。Event参数是XKeyEvent结构,该结构中的keycode可以区分事件驱动的键盘键。
使用键符值区分方法:使用函数参数 event参数和XlookupKeysym函数获取驱动键盘事件的键盘键的键符值。
(2) 定义多个函数接口方法
在资源文件中配置
在程序中定义多个函数,在定义的函数中不需要区分点击的键盘是哪个键。关键字
3.2 完全程序控制加载键盘事件方法
(1) 定义一个函数接口方法
在需要加载键盘事件的组建上加载:
应用程序对翻译表进行解析,解析过程由资源类型转换函数完成:
为目标组件增加翻译表项:
XtAppAddActions(app,keypress,XtNumber(keypress));
4 键盘事件加载的区别
当程序区别键盘键时在不同的平台或环境时需要特定处理。因为在不同的平台和环境表现出不同的键值,在表 4列表显示。
表4 键盘键值的比较
在不同的系统中keycode是不同的,根据不同的keycode处理快捷事件。因此这种键盘事件处理具有局限性,是针对固定的操作系统。
键符值在不同的平台表现相同,表5举例列出键盘对应的键符值。
表5 键盘键符值对应关系
在所有系统平台上键符值是固定的。可以使用不同的系统版本。
键盘加载最终目的是键盘事件尽可能少或不依赖平台和环境,增加程序的可移植性和适应性。在资源文件中设置目标对象的翻译表资源,与设置其他资源类似,但是一旦资源文件中翻译表或被删除或发生错误,应用程序就不能使用,导致程序无法运行。上一节讨论的键盘快捷加载方法特点如下:
(1) 使用资源文件和程序定义单个函数入口方法:必须依赖资源文件,单个函数入口决定了程序需要控制键盘事件的分支;
(2) 使用资源文件和程序定义多个函数入口方法:必须依赖资源文件,多个函数入口需要增加代码,不需要区分键盘键。但是配置灵活;
(3) 完全程序控制定义单个函数入口方法:单个函数入口决定了程序需要控制键盘事件的分支;
(4) 完全程序控制定义多个函数入口方法:函数入口决定了程序需要控制键盘事件不需要区分键盘键,需要增加部分代码。
在区分键盘键时就要选择使用键符值的方法区分,可以解决操作系统和软件环境的变化。
5 结论
空管自动化系统在正式运行后,基本不会调整键盘的快捷键操作功能,但随着系统的硬件和操作系统版本的升级,会出现键盘键值不一致的情况,从而引起界面软件版本的不同。本文提供的键盘快捷功能的实现方法,解决了键盘键值的不同引起的界面软件版本不一致的情况,该技术在现有国产空管自动化系统中得到了很好的应用。
[1]张倪,莫斌.Motif与图形用户界面开发工具.清华大学出版社.1995.
[2]张军.现代空中交通管理.北京航空航天大学出版社.2005.