static int evdev_handle(int fd) { for (int i=0;i<numDevices;i++) { if (devices[i].fd = fd) { int rc; struct input_event ev; while ((rc = libevdev_next_event(devices[i].dev, LIBEVDEV_READ_FLAG_NORMAL, &ev)) >= 0) { if (rc == LIBEVDEV_READ_STATUS_SYNC) fprintf(stderr, "Error: cannot keep up\n"); else if (rc == LIBEVDEV_READ_STATUS_SUCCESS) { if (!handler(&ev, &devices[i])) return LOOP_RETURN; } } if (rc == -ENODEV) { evdev_remove(i); } else if (rc != -EAGAIN && rc < 0) { fprintf(stderr, "Error: %s\n", strerror(-rc)); exit(EXIT_FAILURE); } } } return LOOP_OK; }
static void evdev_read(evdev_t *dev) { struct input_event ev[MAX_EVENTS]; ssize_t bytes; size_t i, count; unsigned button, time; bytes = read(dev->fd, ev, EVENT_SIZE * MAX_EVENTS); if (bytes == -1) { if (errno == EAGAIN) { return; } Com_EPrintf("Couldn't read %s: %s\n", dev->path, strerror(errno)); evdev_remove(dev); return; } if (bytes < EVENT_SIZE) { return; // should not happen } count = bytes / EVENT_SIZE; for (i = 0; i < count; i++) { time = ev[i].time.tv_sec * 1000 + ev[i].time.tv_usec / 1000; switch (ev[i].type) { case EV_KEY: if (ev[i].code >= BTN_MOUSE && ev[i].code < BTN_MOUSE + 8) { button = K_MOUSE1 + ev[i].code - BTN_MOUSE; Key_Event(button, !!ev[i].value, time); } break; case EV_REL: switch (ev[i].code) { case REL_X: evdev.dx += (int)ev[i].value; break; case REL_Y: evdev.dy += (int)ev[i].value; break; case REL_WHEEL: if ((int)ev[i].value == 1) { Key_Event(K_MWHEELUP, qtrue, time); Key_Event(K_MWHEELUP, qfalse, time); } else if ((int)ev[i].value == -1) { Key_Event(K_MWHEELDOWN, qtrue, time); Key_Event(K_MWHEELDOWN, qfalse, time); } break; case REL_HWHEEL: if ((int)ev[i].value == 1) { Key_Event(K_MWHEELRIGHT, qtrue, time); Key_Event(K_MWHEELRIGHT, qfalse, time); } else if ((int)ev[i].value == -1) { Key_Event(K_MWHEELLEFT, qtrue, time); Key_Event(K_MWHEELLEFT, qfalse, time); } break; default: break; } break; default: break; } } }