#include #include #include #include #include #include #include #include #include #include "event.h" #define NUM_DEVS 8 #define NUM_KEYS_DOWN 16 #define BIT(x) (keybits[(x)/sizeof(keybits[0])/8] & \ (1 << ((x) & (sizeof(keybits[0])*8-1)))) static int event_fds[NUM_DEVS]; static int event_fd_count = 0; int in_event_init(void) { int i; in_event_exit(); for (i = 0; event_fd_count < NUM_DEVS; i++) { int u, ret, fd, keybits[KEY_MAX/sizeof(int)]; int support = 0, count = 0; char name[64]; snprintf(name, sizeof(name), "/dev/input/event%d", i); fd = open(name, O_RDONLY|O_NONBLOCK); if (fd == -1) break; /* check supported events */ ret = ioctl(fd, EVIOCGBIT(0, sizeof(support)), &support); if (ret == -1) { printf("in_event: ioctl failed on %s\n", name); goto skip; } if (!(support & (1 << EV_KEY))) goto skip; ret = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits); if (ret == -1) { printf("in_event: ioctl failed on %s\n", name); goto skip; } printf("%s: %08x\n", name, support); /* check for interesting keys */ for (u = 0; u < KEY_MAX; u++) { if (BIT(u) && u != KEY_POWER) count++; } if (count == 0) goto skip; ioctl(fd, EVIOCGNAME(sizeof(name)), name); printf("event: %d: using \"%s\" with %d events\n", event_fd_count, name, count); event_fds[event_fd_count++] = fd; continue; skip: close(fd); } printf("event: %d devices found.\n", event_fd_count); return 0; } void in_event_exit(void) { for (; event_fd_count > 0; event_fd_count--) close(event_fds[event_fd_count - 1]); } int in_event_update(int binds[512]) { struct input_event ev[16]; int d, rd, ret; int result = 0; for (d = 0; d < event_fd_count; d++) { int keybits[KEY_MAX/sizeof(int)]; int fd = event_fds[d]; int u, changed = 0; while (1) { rd = read(fd, ev, sizeof(ev)); if (rd < (int)sizeof(ev[0])) { if (errno != EAGAIN) perror("event: read failed"); break; } changed = 1; } if (!changed) continue; ret = ioctl(fd, EVIOCGKEY(sizeof(keybits)), keybits); if (ret == -1) { printf("in_event: ioctl failed on %d\n", d); continue; } for (u = 0; u < KEY_MAX; u++) { if (BIT(u)) { printf(" %d", u); result |= binds[u]; } } printf("\n"); } return result; } int main() { in_event_init(); while (1) { int b[512]; in_event_update(b); sleep(1); } return 0; }