转自:http://book.51cto.com/art/201304/390529.htm
在Linux系统中,所有的输入设备(键盘、鼠标、触摸屏)都使用统一的输入系统进行管理。每个/dev/input/eventX都对应着一个输入设备。这些输入设备可以通过对应的/sys/class/ input/inputX/name文件查询到对应的设备名称。在/proc/bus/input/devices中有所有设备的详细信息。
当应用程序打开/dev/input/eventX设备后,可以使用read函数实现输入事件的读取。在linux/input.h中定义了输入事件的结构体:
- struct input_event {
- struct timeval time; //时间戳
- __u16 type; //事件类型
- __u16 code; //事件代码
- __s32 value; //事件的值
- };
表4-14中介绍了事件类型的定义及含义,触摸屏使用的事件类型为EV_ABS。
表4-14 事件类型定义
事 件 类 型 | 含 义 | 事 件 类 型 | 含 义 |
EV_SYN | 同步时间 | EV_LED | LED |
EV_KEY | 按键事件 | EV_SND | 声音 |
EV_REL | 相对坐标(鼠标) | EV_REP | 重复 |
EV_ABS | 绝对坐标(触摸屏) | EV_FF | 力反馈 |
EV_MSC | 其他 | EV_PWR | 电源键 |
事件代码的含义也不同,见表4-15。
表4-15 事件代码的含义
事件类型 | 事件代码的含义 |
EV_KEY | 键值 |
EV_REL | 轨迹类型(X轴方向或Y轴方向) |
EV_ABS | 坐标类型(X轴坐标或Y轴坐标) |
事件值的含义见表4-16。
表4-16 事件值的含义
事件类型 | 事件值的含义 |
EV_KEY | 1表示按键按下;0表示按键抬起 |
EV_REL | 鼠标偏移量(X轴偏移或Y轴偏移) |
EV_ABS | 坐标值(X轴坐标或Y轴坐标) |
在Linux的GUI系统中,会利用上述接口对所有的输入设备进行管理。应用程序可以通过在GUI中注册监听器、在消息队列中增加对应事件的处理函数,完成输入设备事件的处理。
应用程序也可以通过write函数,向设备写入input_event事件,实现对输入设备事件的模拟。