相对坐标与绝对坐标

相对坐标与绝对坐标

  • 绝对坐标

指定EV_ABS值,则dx和dy包含065,535之间的归一化绝对坐标。 事件过程将这些坐标映射到显示表面上。 坐标 (0,0) 映射到显示表面的左上角(65535,65535) 映射到右下角。

  • 相对坐标

未指定EV_ABS值,则dx和dy指定从生成最后一个点击事件(最后报告的位置)开始的相对运动。 正值表示光标向右(或向下)移动; 负值表示光标向左(或向上)移动。

Linux中输入设备的事件类型

  • EV_SYN 0x00 同步事件
  • EV_KEY 0x01 按键事件,如KEY_VOLUMEDOWN
  • EV_REL 0x02 相对坐标,如鼠标上报的坐标
  • EV_ABS 0x03 绝对坐标,如触摸屏上报的坐标
  • EV_MSC 0x04 其它
  • EV_LED 0x11 LED
  • EV_SND 0x12 声音
  • EV_REP 0x14 Repeat
  • EV_FF 0x15 力反馈

获取鼠标坐标值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
#include <linux/input.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc,char **argv)
{
int fd, retval;
char buf[6];
fd_set readfds;
struct timeval tv;

fd = open( "/dev/input/mice", O_RDONLY );
if(fd<0) {
printf("Failed to open \"/dev/input/mice\".\n");
exit(1);
} else {
printf("open \"/dev/input/mice\" successfuly.\n");
}

while(1) {
tv.tv_sec = 5;
tv.tv_usec = 0;

FD_ZERO(&readfds);
FD_SET(fd, &readfds);

retval = select(fd+1, &readfds, NULL, NULL, &tv);
if(retval == 0) {
printf("Time out!\n");
}
if(FD_ISSET(fd,&readfds)) {
if(read(fd, buf, 6) <= 0) {
continue;
}
printf("Button type=%d, X=%d, Y=%d, Z=%d\n", (buf[0] & 0x07), buf[1], buf[2], buf[3]);
}
}

close(fd);
return 0;
}