void SDL_EVDEV_Quit(void) { if (_this == NULL) { return; } _this->ref_count -= 1; if (_this->ref_count < 1) { #if SDL_USE_LIBUDEV SDL_UDEV_DelCallback(SDL_EVDEV_udev_callback); SDL_UDEV_Quit(); #endif /* SDL_USE_LIBUDEV */ if (_this->console_fd >= 0) { SDL_EVDEV_unmute_keyboard(_this->console_fd, _this->kb_mode); close(_this->console_fd); } /* Remove existing devices */ while(_this->first != NULL) { SDL_EVDEV_device_removed(_this->first->path); } SDL_assert(_this->first == NULL); SDL_assert(_this->last == NULL); SDL_assert(_this->num_devices == 0); SDL_free(_this); _this = NULL; } }
void SDL_UDEV_Scan(void) { struct udev_enumerate *enumerate = NULL; struct udev_list_entry *devs = NULL; struct udev_list_entry *item = NULL; if (_this == NULL) { return; } enumerate = _this->udev_enumerate_new(_this->udev); if (enumerate == NULL) { SDL_UDEV_Quit(); SDL_SetError("udev_monitor_new_from_netlink() failed"); return; } _this->udev_enumerate_add_match_subsystem(enumerate, "input"); _this->udev_enumerate_add_match_subsystem(enumerate, "sound"); _this->udev_enumerate_scan_devices(enumerate); devs = _this->udev_enumerate_get_list_entry(enumerate); for (item = devs; item; item = _this->udev_list_entry_get_next(item)) { const char *path = _this->udev_list_entry_get_name(item); struct udev_device *dev = _this->udev_device_new_from_syspath(_this->udev, path); if (dev != NULL) { device_event(SDL_UDEV_DEVICEADDED, dev); _this->udev_device_unref(dev); } } _this->udev_enumerate_unref(enumerate); }
void SDL_EVDEV_Quit(void) { if (_this == NULL) { return; } _this->ref_count -= 1; if (_this->ref_count < 1) { #if SDL_USE_LIBUDEV SDL_UDEV_DelCallback(SDL_EVDEV_udev_callback); SDL_UDEV_Quit(); #endif /* SDL_USE_LIBUDEV */ SDL_EVDEV_kbd_quit(_this->kbd); /* Remove existing devices */ while(_this->first != NULL) { SDL_EVDEV_device_removed(_this->first->path); } SDL_assert(_this->first == NULL); SDL_assert(_this->last == NULL); SDL_assert(_this->num_devices == 0); SDL_free(_this); _this = NULL; } }
int SDL_UDEV_Init(void) { int retval = 0; if (_this == NULL) { _this = (SDL_UDEV_PrivateData *) SDL_calloc(1, sizeof(*_this)); if(_this == NULL) { return SDL_OutOfMemory(); } retval = SDL_UDEV_LoadLibrary(); if (retval < 0) { SDL_UDEV_Quit(); return retval; } /* Set up udev monitoring * Listen for input devices (mouse, keyboard, joystick, etc) and sound devices */ _this->udev = _this->udev_new(); if (_this->udev == NULL) { SDL_UDEV_Quit(); return SDL_SetError("udev_new() failed"); } _this->udev_mon = _this->udev_monitor_new_from_netlink(_this->udev, "udev"); if (_this->udev_mon == NULL) { SDL_UDEV_Quit(); return SDL_SetError("udev_monitor_new_from_netlink() failed"); } _this->udev_monitor_filter_add_match_subsystem_devtype(_this->udev_mon, "input", NULL); _this->udev_monitor_filter_add_match_subsystem_devtype(_this->udev_mon, "sound", NULL); _this->udev_monitor_enable_receiving(_this->udev_mon); /* Do an initial scan of existing devices */ SDL_UDEV_Scan(); } _this->ref_count += 1; return retval; }
static int JoystickInitWithUdev(void) { if (SDL_UDEV_Init() < 0) { return SDL_SetError("Could not initialize UDEV"); } /* Set up the udev callback */ if (SDL_UDEV_AddCallback(joystick_udev_callback) < 0) { SDL_UDEV_Quit(); return SDL_SetError("Could not set up joystick <-> udev callback"); } /* Force a scan to build the initial device list */ SDL_UDEV_Scan(); return numjoysticks; }
int SDL_EVDEV_Init(void) { if (_this == NULL) { _this = (SDL_EVDEV_PrivateData*)SDL_calloc(1, sizeof(*_this)); if (_this == NULL) { return SDL_OutOfMemory(); } #if SDL_USE_LIBUDEV if (SDL_UDEV_Init() < 0) { SDL_free(_this); _this = NULL; return -1; } /* Set up the udev callback */ if (SDL_UDEV_AddCallback(SDL_EVDEV_udev_callback) < 0) { SDL_UDEV_Quit(); SDL_free(_this); _this = NULL; return -1; } /* Force a scan to build the initial device list */ SDL_UDEV_Scan(); #else /* TODO: Scan the devices manually, like a caveman */ #endif /* SDL_USE_LIBUDEV */ /* We need a physical terminal (not PTS) to be able to translate key code to symbols via the kernel tables */ _this->console_fd = SDL_EVDEV_get_active_tty(); /* Mute the keyboard so keystrokes only generate evdev events and do not leak through to the console */ SDL_EVDEV_mute_keyboard(_this->console_fd, &_this->kb_mode); } _this->ref_count += 1; return 0; }
int SDL_EVDEV_Init(void) { if (_this == NULL) { _this = (SDL_EVDEV_PrivateData*)SDL_calloc(1, sizeof(*_this)); if (_this == NULL) { return SDL_OutOfMemory(); } #if SDL_USE_LIBUDEV if (SDL_UDEV_Init() < 0) { SDL_free(_this); _this = NULL; return -1; } /* Set up the udev callback */ if (SDL_UDEV_AddCallback(SDL_EVDEV_udev_callback) < 0) { SDL_UDEV_Quit(); SDL_free(_this); _this = NULL; return -1; } /* Force a scan to build the initial device list */ SDL_UDEV_Scan(); #else /* TODO: Scan the devices manually, like a caveman */ #endif /* SDL_USE_LIBUDEV */ _this->kbd = SDL_EVDEV_kbd_init(); } _this->ref_count += 1; return 0; }