void loop_init() { main_thread_id = pthread_self(); sigset_t sigset; sigemptyset(&sigset); sigaddset(&sigset, SIGHUP); sigaddset(&sigset, SIGTERM); sigaddset(&sigset, SIGINT); sigaddset(&sigset, SIGQUIT); sigprocmask(SIG_BLOCK, &sigset, NULL); sigFd = signalfd(-1, &sigset, 0); loop_add_fd(sigFd, loop_sig_handler, POLLIN | POLLERR | POLLHUP); }
void evdev_create(const char* device, char* mapFile) { int fd = open(device, O_RDONLY|O_NONBLOCK); if (fd <= 0) { fprintf(stderr, "Failed to open device %s\n", device); fflush(stderr); return; } int dev = numDevices; numDevices++; if (devices == NULL) { devices = malloc(sizeof(struct input_device)); } else { devices = realloc(devices, sizeof(struct input_device)*numDevices); } if (devices == NULL) { fprintf(stderr, "Not enough memory\n"); exit(EXIT_FAILURE); } memset(&devices[dev], 0, sizeof(devices[0])); devices[dev].fd = fd; devices[dev].dev = libevdev_new(); libevdev_set_fd(devices[dev].dev, devices[dev].fd); if (mapFile != NULL) mapping_load(mapFile, &(devices[dev].map)); devices[dev].controllerId = -1; evdev_init_parms(&devices[dev], &(devices[dev].xParms), devices[dev].map.abs_x); evdev_init_parms(&devices[dev], &(devices[dev].yParms), devices[dev].map.abs_y); evdev_init_parms(&devices[dev], &(devices[dev].zParms), devices[dev].map.abs_z); evdev_init_parms(&devices[dev], &(devices[dev].rxParms), devices[dev].map.abs_rx); evdev_init_parms(&devices[dev], &(devices[dev].ryParms), devices[dev].map.abs_ry); evdev_init_parms(&devices[dev], &(devices[dev].rzParms), devices[dev].map.abs_rz); evdev_init_parms(&devices[dev], &(devices[dev].dpadxParms), devices[dev].map.abs_dpad_x); evdev_init_parms(&devices[dev], &(devices[dev].dpadyParms), devices[dev].map.abs_dpad_y); if (grabbingDevices) { if (ioctl(fd, EVIOCGRAB, 1) < 0) { fprintf(stderr, "EVIOCGRAB failed with error %d\n", errno); } } loop_add_fd(devices[dev].fd, &evdev_handle, POLLIN); }
void udev_init(bool autoload, char* mapfile) { udev = udev_new(); if (!udev) { fprintf(stderr, "Can't create udev\n"); exit(1); } autoadd = autoload; if (autoload) { struct udev_enumerate *enumerate = udev_enumerate_new(udev); udev_enumerate_add_match_subsystem(enumerate, "input"); udev_enumerate_scan_devices(enumerate); struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate); struct udev_list_entry *dev_list_entry; udev_list_entry_foreach(dev_list_entry, devices) { const char *path = udev_list_entry_get_name(dev_list_entry); struct udev_device *dev = udev_device_new_from_syspath(udev, path); const char *devnode = udev_device_get_devnode(dev); int id; if (devnode != NULL && sscanf(devnode, "/dev/input/event%d", &id) == 1) { evdev_create(devnode, mapfile); } udev_device_unref(dev); } udev_enumerate_unref(enumerate); } udev_mon = udev_monitor_new_from_netlink(udev, "udev"); udev_monitor_filter_add_match_subsystem_devtype(udev_mon, "input", NULL); udev_monitor_enable_receiving(udev_mon); defaultMapfile = mapfile; int udev_fd = udev_monitor_get_fd(udev_mon); loop_add_fd(udev_fd, &udev_handle, POLLIN); }