8 #include <linux/input.h>
14 #define NUM_KEYS_DOWN 16
16 #define BIT(x) (keybits[(x)/sizeof(keybits[0])/8] & \
17 (1 << ((x) & (sizeof(keybits[0])*8-1))))
19 static int event_fds[NUM_DEVS];
20 static int event_fd_count = 0;
22 int in_event_init(void)
28 for (i = 0; event_fd_count < NUM_DEVS; i++)
30 int u, ret, fd, keybits[KEY_MAX/sizeof(int)];
31 int support = 0, count = 0;
34 snprintf(name, sizeof(name), "/dev/input/event%d", i);
35 fd = open(name, O_RDONLY|O_NONBLOCK);
39 /* check supported events */
40 ret = ioctl(fd, EVIOCGBIT(0, sizeof(support)), &support);
42 printf("in_event: ioctl failed on %s\n", name);
46 if (!(support & (1 << EV_KEY)))
49 ret = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits);
51 printf("in_event: ioctl failed on %s\n", name);
55 printf("%s: %08x\n", name, support);
57 /* check for interesting keys */
58 for (u = 0; u < KEY_MAX; u++) {
59 if (BIT(u) && u != KEY_POWER)
66 ioctl(fd, EVIOCGNAME(sizeof(name)), name);
67 printf("event: %d: using \"%s\" with %d events\n",
68 event_fd_count, name, count);
69 event_fds[event_fd_count++] = fd;
76 printf("event: %d devices found.\n", event_fd_count);
80 void in_event_exit(void)
82 for (; event_fd_count > 0; event_fd_count--)
83 close(event_fds[event_fd_count - 1]);
86 int in_event_update(int binds[512])
88 struct input_event ev[16];
92 for (d = 0; d < event_fd_count; d++)
94 int keybits[KEY_MAX/sizeof(int)];
95 int fd = event_fds[d];
99 rd = read(fd, ev, sizeof(ev));
100 if (rd < (int)sizeof(ev[0])) {
102 perror("event: read failed");
112 ret = ioctl(fd, EVIOCGKEY(sizeof(keybits)), keybits);
114 printf("in_event: ioctl failed on %d\n", d);
118 for (u = 0; u < KEY_MAX; u++) {