键盘输入引擎的设计
第2部分要开发的是小键盘输入引擎,它负责把键盘驱动提供的原始键盘输入事件和数据,即小键盘扫描码转换为抽象的键盘事件和数据。
1.Minigui的IAL接口
前面已提到IAL定义了一组不依赖于任何特殊硬件的抽象接口,而用于实现这一抽象接口的底层代码就称为输入引擎。在代码实现上IAL通过INPUT结构来表示输入引擎。它实际是一个拥有若干函数指针成员的结构体,IAL在特定的时候调用这些函数来达到操作硬件的目的。因此编写特定的输入引擎,主要就是编码实现INPUT结构中的各个函数。该结构定义在IAL.H中,其中的主要成员函数如下所列;
typedef struct tagINPUT
{
 char* id;
 // Initialization and termination
 BOOL (*init_input) (struct tagINPUT *input, const char* mdev, const char* mtype);
void (*term_input) (void);

// Mouse operations
 int (*update_mouse) (void);
void (*get_mouse_xy) (int* x, int* y);
 void (*set_mouse_xy) (int x, int y);
int (*get_mouse_button) (void);
 void (*set_mouse_range) (int minx, int miny, int maxx, int maxy);
 void (*suspend_mouse) (void);
 int (*resume_mouse) (void);

// Keyboard operations
int (*update_keyboard) (void);
 const char* (*get_keyboard_state) (void);
 void (*suspend_keyboard) (void);
int (*resume_keyboard) (void);
void (*set_leds) (unsigned int leds);

// Event
#ifdef _LITE_VERSION
int (*wait_event) (int which, int maxfd, fd_set *in, fd_set *out, fd_set *except,struct timeval *timeout);
#else
int (*wait_event) (int which, fd_set *in, fd_set *out, fd_set *except,
 struct timeval *timeout);
#endif
char mdev [MAX_PATH + 1];
}INPUT;
extern INPUT* cur_input;
系统启动后,将根据配置文件寻找特定的输入引擎作为当前的输入引擎,并对全局变量cur_input(表当前使用的输入引擎)赋值。为书写方便,定义了当前引擎的C语言宏。
#define IAL_InitInput (*cur_input->init_input)
#define IAL_TermInput (*cur_input->term_input)
#define IAL_UpdateMouse (*cur_input->update_mouse)
#define IAL_GetMouseXY (*cur_input->get_mouse_xy)
#define IAL_GetMouseButton (*cur_input->get_mouse_button)
#define IAL_SetMouseXY if (cur_input->set_mouse_xy) (*cur_input->set_mouse_xy)
#define IAL_SetMouseRange if (cur_input->set_mouse_range) (*cur_input->set_mouse_range)
#define IAL_SuspendMouse if (cur_input->suspend_mouse) (*cur_input->suspend_mouse)
#define IAL_UpdateKeyboard (*cur_input->update_keyboard)
#define IAL_GetKeyboardState (*cur_input->get_keyboard_state)
#define IAL_SuspendKeyboard if (cur_input->suspend_keyboard) (*cur_input->suspend_keyboard)
#define IAL_SetLeds(leds) if (cur_input->set_leds) (*cur_input->set_leds) (leds)

2. 编写小键盘输入引擎
对于小键盘输入,鼠标操作接口函数不用进行任何操作,直接返回即可,主要编写的事是keyboard_update 和wait_event函数。当minigui应用程序运行时,相关的底层事件处理例程会不断地调用wait_event 函数查询是否有输入事件发生,故在该函数中调用小键盘驱动的read函数,获取用户输入的按键信息。若有键盘事件发生,则返回IAL_KEYEVENT,底层事件就会调用keyboard_update函数进行处理,获取当前的键盘状态。

MINIGUI使用一个一维数组state[128]记录按键的各个状态,该数组定义在/include/common.h下,如果对应位为1,则该按键被按下,否则改键未被按下,keyboard_update函数所作的功能就是根据驱动程序的返回值,来更新state数组元素的值,从而向上层驱动程序和应用程序反映按键的状态。
在server.c中确定是否为键盘事件,并将收集到的信息转化为上层能理解的消息。
在初始化函数InitNAMEInput中先打开小键盘输入设备成功以后对输入引擎的其他成员(底层输入操作接口函数)赋值返回true,终止清除函数TermNAMEInput的主要工作是关闭键盘输入文件
输入引擎相关内容的格式可参照ial目录下的其他输入引擎,至此完成了小键盘输入引擎文件的开发.

3添加输入引擎
添加小键盘输入引擎方法步骤如下:
1仿照ial下的其它文件编写编写mykey.h和mykey.c文件一同保存到ial下’
2在ial.c文件中添加新引擎的入口位置及格式参考该文件中其他引擎"’
3在config.h 和/ial/Makefile.am等文件中的其他引擎信息之后加入新引擎信息,然后一起编译
4最后还要修改minigui.cfg 文件的ial引擎