diff options
author | RĂ©mi Verschelde <remi@verschelde.fr> | 2021-02-17 13:40:15 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-17 13:40:15 +0100 |
commit | ab4f5c0668d2c90055f66f9fde98b4deecb19128 (patch) | |
tree | ba9044d6ec89164cc74116b578358798ec0ea50c /platform/linuxbsd/joypad_linux.cpp | |
parent | fa24c99a5c0454586313958a04375ab63ac7d544 (diff) | |
parent | a10c259c1d89fbce2d0e05ac60ac5c78d431c070 (diff) |
Merge pull request #46117 from akien-mga/dynamic-load-libudev
Dynamically load libudev.so.1 on Linux
Diffstat (limited to 'platform/linuxbsd/joypad_linux.cpp')
-rw-r--r-- | platform/linuxbsd/joypad_linux.cpp | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/platform/linuxbsd/joypad_linux.cpp b/platform/linuxbsd/joypad_linux.cpp index 4e96e6d687..d1115b146b 100644 --- a/platform/linuxbsd/joypad_linux.cpp +++ b/platform/linuxbsd/joypad_linux.cpp @@ -39,7 +39,7 @@ #include <unistd.h> #ifdef UDEV_ENABLED -#include <libudev.h> +#include "libudev-so_wrap.h" #endif #define LONG_BITS (sizeof(long) * 8) @@ -72,13 +72,22 @@ void JoypadLinux::Joypad::reset() { } JoypadLinux::JoypadLinux(Input *in) { - exit_udev = false; +#ifdef UDEV_ENABLED + use_udev = initialize_libudev() == 0; + if (use_udev) { + print_verbose("JoypadLinux: udev enabled and loaded successfully."); + } else { + print_verbose("JoypadLinux: udev enabled, but couldn't be loaded. Falling back to /dev/input to detect joypads."); + } +#else + print_verbose("JoypadLinux: udev disabled, parsing /dev/input to detect joypads."); +#endif input = in; joy_thread.start(joy_thread_func, this); } JoypadLinux::~JoypadLinux() { - exit_udev = true; + exit_monitor = true; joy_thread.wait_to_finish(); close_joypad(); } @@ -92,11 +101,18 @@ void JoypadLinux::joy_thread_func(void *p_user) { void JoypadLinux::run_joypad_thread() { #ifdef UDEV_ENABLED - udev *_udev = udev_new(); - ERR_FAIL_COND(!_udev); - enumerate_joypads(_udev); - monitor_joypads(_udev); - udev_unref(_udev); + if (use_udev) { + udev *_udev = udev_new(); + if (!_udev) { + use_udev = false; + ERR_FAIL_MSG("Failed getting an udev context, falling back to parsing /dev/input."); + } + enumerate_joypads(_udev); + monitor_joypads(_udev); + udev_unref(_udev); + } else { + monitor_joypads(); + } #else monitor_joypads(); #endif @@ -137,7 +153,7 @@ void JoypadLinux::monitor_joypads(udev *p_udev) { udev_monitor_enable_receiving(mon); int fd = udev_monitor_get_fd(mon); - while (!exit_udev) { + while (!exit_monitor) { fd_set fds; struct timeval tv; int ret; @@ -179,7 +195,7 @@ void JoypadLinux::monitor_joypads(udev *p_udev) { #endif void JoypadLinux::monitor_joypads() { - while (!exit_udev) { + while (!exit_monitor) { { MutexLock lock(joy_mutex); |