Fixed bug 4267 - linkage failure with --enable-hidapi because of missing libudev symbols

Ozkan Sezer

hidapi dynamic udev initial patch
This commit is contained in:
Sam Lantinga 2018-09-24 16:33:14 -07:00
parent 7aff227a2d
commit e5786b21c3
3 changed files with 83 additions and 52 deletions

View file

@ -97,6 +97,10 @@ static SDL_HIDAPI_DeviceDriver *SDL_HIDAPI_drivers[] = {
static SDL_HIDAPI_Device *SDL_HIDAPI_devices;
static int SDL_HIDAPI_numjoysticks = 0;
#if defined(SDL_USE_LIBUDEV)
static const SDL_UDEV_Symbols * usyms = NULL;
#endif
static struct
{
SDL_bool m_bHaveDevicesChanged;
@ -272,12 +276,15 @@ HIDAPI_InitializeDiscovery()
SDL_HIDAPI_discovery.m_pUdevMonitor = NULL;
SDL_HIDAPI_discovery.m_nUdevFd = -1;
SDL_HIDAPI_discovery.m_pUdev = udev_new();
usyms = SDL_UDEV_GetUdevSyms();
if (usyms) {
SDL_HIDAPI_discovery.m_pUdev = usyms->udev_new();
}
if (SDL_HIDAPI_discovery.m_pUdev) {
SDL_HIDAPI_discovery.m_pUdevMonitor = udev_monitor_new_from_netlink(SDL_HIDAPI_discovery.m_pUdev, "udev");
SDL_HIDAPI_discovery.m_pUdevMonitor = usyms->udev_monitor_new_from_netlink(SDL_HIDAPI_discovery.m_pUdev, "udev");
if (SDL_HIDAPI_discovery.m_pUdevMonitor) {
udev_monitor_enable_receiving(SDL_HIDAPI_discovery.m_pUdevMonitor);
SDL_HIDAPI_discovery.m_nUdevFd = udev_monitor_get_fd(SDL_HIDAPI_discovery.m_pUdevMonitor);
usyms->udev_monitor_enable_receiving(SDL_HIDAPI_discovery.m_pUdevMonitor);
SDL_HIDAPI_discovery.m_nUdevFd = usyms->udev_monitor_get_fd(SDL_HIDAPI_discovery.m_pUdevMonitor);
SDL_HIDAPI_discovery.m_bCanGetNotifications = SDL_TRUE;
}
}
@ -339,9 +346,9 @@ HIDAPI_UpdateDiscovery()
SDL_HIDAPI_discovery.m_bHaveDevicesChanged = SDL_TRUE;
pUdevDevice = udev_monitor_receive_device(SDL_HIDAPI_discovery.m_pUdevMonitor);
pUdevDevice = usyms->udev_monitor_receive_device(SDL_HIDAPI_discovery.m_pUdevMonitor);
if (pUdevDevice) {
udev_device_unref(pUdevDevice);
usyms->udev_device_unref(pUdevDevice);
}
}
}
@ -370,10 +377,14 @@ HIDAPI_ShutdownDiscovery()
#if defined(SDL_USE_LIBUDEV)
if (SDL_HIDAPI_discovery.m_pUdevMonitor) {
udev_monitor_unref(SDL_HIDAPI_discovery.m_pUdevMonitor);
usyms->udev_monitor_unref(SDL_HIDAPI_discovery.m_pUdevMonitor);
}
if (SDL_HIDAPI_discovery.m_pUdev) {
udev_unref(SDL_HIDAPI_discovery.m_pUdev);
usyms->udev_unref(SDL_HIDAPI_discovery.m_pUdev);
}
if (usyms) {
SDL_UDEV_ReleaseUdevSyms();
usyms = NULL;
}
#endif
}