static void linuxraw_joypad_poll(void) { int i, ret; struct epoll_event events[MAX_USERS + 1]; retry: ret = epoll_waiting(events, MAX_USERS + 1, 0); if (ret < 0 && errno == EINTR) goto retry; for (i = 0; i < ret; i++) { if (events[i].data.ptr) linuxraw_poll_pad((struct linuxraw_joypad*)events[i].data.ptr); else handle_plugged_pad(); } }
static void udev_input_poll(void *data) { int i, ret; struct epoll_event events[32]; udev_input_t *udev = (udev_input_t*)data; if (!udev) return; udev->mouse_x = udev->mouse_y = 0; udev->mouse_wu = udev->mouse_wd = 0; udev->mouse_whu = udev->mouse_whd = 0; while (udev->monitor && udev_hotplug_available(udev->monitor)) udev_input_handle_hotplug(udev); ret = epoll_waiting(&udev->epfd, events, ARRAY_SIZE(events), 0); for (i = 0; i < ret; i++) { if (events[i].events & EPOLLIN) { int j, len; struct input_event input_events[32]; udev_input_device_t *device = (udev_input_device_t*)events[i].data.ptr; while ((len = read(device->fd, input_events, sizeof(input_events))) > 0) { len /= sizeof(*input_events); for (j = 0; j < len; j++) device->handle_cb(udev, &input_events[j], device); } } } if (udev->joypad) udev->joypad->poll(); }