x11: make dependancy on libudev optional

This commit is contained in:
hondres 2016-02-14 15:13:11 +01:00
parent 8e359963b6
commit b350ece864
3 changed files with 41 additions and 11 deletions

View file

@ -56,7 +56,7 @@ def get_opts():
('use_sanitizer','Use llvm compiler sanitize address','no'), ('use_sanitizer','Use llvm compiler sanitize address','no'),
('use_leak_sanitizer','Use llvm compiler sanitize memory leaks','no'), ('use_leak_sanitizer','Use llvm compiler sanitize memory leaks','no'),
('pulseaudio','Detect & Use pulseaudio','yes'), ('pulseaudio','Detect & Use pulseaudio','yes'),
('gamepad','Gamepad support, requires libudev and libevdev','yes'), ('udev','Use udev for gamepad connection callbacks','no'),
('new_wm_api', 'Use experimental window management API','no'), ('new_wm_api', 'Use experimental window management API','no'),
('debug_release', 'Add debug symbols to release version','no'), ('debug_release', 'Add debug symbols to release version','no'),
] ]
@ -156,20 +156,18 @@ def configure(env):
else: else:
print("ALSA libraries not found, disabling driver") print("ALSA libraries not found, disabling driver")
if (env["gamepad"]=="yes" and platform.system() == "Linux"): if (platform.system() == "Linux"):
env.Append(CPPFLAGS=["-DJOYDEV_ENABLED"])
if (env["udev"]=="yes"):
# pkg-config returns 0 when the lib exists... # pkg-config returns 0 when the lib exists...
found_udev = not os.system("pkg-config --exists libudev") found_udev = not os.system("pkg-config --exists libudev")
if (found_udev): if (found_udev):
print("Enabling gamepad support with udev") print("Enabling udev support")
env.Append(CPPFLAGS=["-DJOYDEV_ENABLED"]) env.Append(CPPFLAGS=["-DUDEV_ENABLED"])
env.ParseConfig('pkg-config libudev --cflags --libs') env.ParseConfig('pkg-config libudev --cflags --libs')
else: else:
print("libudev development libraries not found") print("libudev development libraries not found, disabling udev support")
print("Some libraries are missing for the required gamepad support, aborting!")
print("Install the mentioned libraries or build with 'gamepad=no' to disable gamepad support.")
sys.exit(255)
if (env["pulseaudio"]=="yes"): if (env["pulseaudio"]=="yes"):
if not os.system("pkg-config --exists libpulse-simple"): if not os.system("pkg-config --exists libpulse-simple"):

View file

@ -99,14 +99,18 @@ void joystick_linux::joy_thread_func(void *p_user) {
} }
void joystick_linux::run_joystick_thread() { void joystick_linux::run_joystick_thread() {
#ifdef UDEV_ENABLED
udev *_udev = udev_new(); udev *_udev = udev_new();
ERR_FAIL_COND(!_udev); ERR_FAIL_COND(!_udev);
enumerate_joysticks(_udev); enumerate_joysticks(_udev);
monitor_joysticks(_udev); monitor_joysticks(_udev);
udev_unref(_udev); udev_unref(_udev);
#else
monitor_joysticks();
#endif
} }
#ifdef UDEV_ENABLED
void joystick_linux::enumerate_joysticks(udev *p_udev) { void joystick_linux::enumerate_joysticks(udev *p_udev) {
udev_enumerate *enumerate; udev_enumerate *enumerate;
@ -192,6 +196,23 @@ void joystick_linux::monitor_joysticks(udev *p_udev) {
//printf("exit udev\n"); //printf("exit udev\n");
udev_monitor_unref(mon); udev_monitor_unref(mon);
} }
#endif
void joystick_linux::monitor_joysticks() {
while (!exit_udev) {
joy_mutex->lock();
for (int i = 0; i < 32; i++) {
char fname[64];
sprintf(fname, "/dev/input/event%d", i);
if (attached_devices.find(fname) == -1) {
open_joystick(fname);
}
}
joy_mutex->unlock();
usleep(1000000); // 1s
}
}
int joystick_linux::get_free_joy_slot() const { int joystick_linux::get_free_joy_slot() const {
@ -229,6 +250,7 @@ void joystick_linux::close_joystick(int p_id) {
close(joy.fd); close(joy.fd);
joy.fd = -1; joy.fd = -1;
attached_devices.remove(attached_devices.find(joy.devpath));
input->joy_connection_changed(p_id, false, ""); input->joy_connection_changed(p_id, false, "");
}; };
}; };
@ -302,6 +324,9 @@ void joystick_linux::open_joystick(const char *p_path) {
unsigned long keybit[NBITS(KEY_MAX)] = { 0 }; unsigned long keybit[NBITS(KEY_MAX)] = { 0 };
unsigned long absbit[NBITS(ABS_MAX)] = { 0 }; unsigned long absbit[NBITS(ABS_MAX)] = { 0 };
// add to attached devices so we don't try to open it again
attached_devices.push_back(String(p_path));
if ((ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), evbit) < 0) || if ((ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), evbit) < 0) ||
(ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) < 0) || (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) < 0) ||
(ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit) < 0)) { (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit) < 0)) {
@ -446,6 +471,9 @@ uint32_t joystick_linux::process_joysticks(uint32_t p_event_id) {
p_event_id = input->joy_axis(p_event_id, i, index, joy->curr_axis[index]); p_event_id = input->joy_axis(p_event_id, i, index, joy->curr_axis[index]);
} }
} }
if (len == 0 || (len < 0 && errno != EAGAIN)) {
close_joystick(i);
};
} }
joy_mutex->unlock(); joy_mutex->unlock();
return p_event_id; return p_event_id;

View file

@ -73,6 +73,7 @@ private:
Thread *joy_thread; Thread *joy_thread;
InputDefault *input; InputDefault *input;
Joystick joysticks[JOYSTICKS_MAX]; Joystick joysticks[JOYSTICKS_MAX];
Vector<String> attached_devices;
static void joy_thread_func(void *p_user); static void joy_thread_func(void *p_user);
@ -81,8 +82,11 @@ private:
void setup_joystick_properties(int p_id); void setup_joystick_properties(int p_id);
void close_joystick(int p_id = -1); void close_joystick(int p_id = -1);
#ifdef UDEV_ENABLED
void enumerate_joysticks(struct udev *_udev); void enumerate_joysticks(struct udev *_udev);
void monitor_joysticks(struct udev *_udev); void monitor_joysticks(struct udev *_udev);
#endif
void monitor_joysticks();
void run_joystick_thread(); void run_joystick_thread();
void open_joystick(const char* path); void open_joystick(const char* path);