Fix Linux crash with Xbox One controller, fix compile warnings

This commit is contained in:
rdb 2016-06-28 17:49:47 +02:00
parent fd16e34660
commit c7dbf193f1
2 changed files with 49 additions and 36 deletions

View File

@ -181,7 +181,10 @@ do_set_vibration(double strong, double weak) {
play.code = _ff_id;
play.value = 1;
write(_fd, &play, sizeof(play));
if (write(_fd, &play, sizeof(play)) < 0) {
device_cat.warning()
<< "Failed to write force-feedback event: " << strerror(errno) << "\n";
}
}
}
@ -301,22 +304,22 @@ init_device() {
int num_bits = ioctl(_fd, EVIOCGBIT(EV_ABS, sizeof(axes)), axes) << 3;
for (int i = 0; i < num_bits; ++i) {
if (test_bit(i, axes)) {
// Emulate D-Pad buttons if necessary.
if (i > ABS_HAT0Y) {
if (i >= ABS_HAT0X) {
set_control_map(i, C_none);
} else if (i == ABS_HAT0X && emulate_dpad) {
_dpad_x_axis = i;
_dpad_left_button = (int)_buttons.size();
_buttons.push_back(ButtonState(GamepadButton::dpad_left()));
_buttons.push_back(ButtonState(GamepadButton::dpad_right()));
} else if (i == ABS_HAT0Y && emulate_dpad) {
_dpad_y_axis = i;
_dpad_up_button = (int)_buttons.size();
_buttons.push_back(ButtonState(GamepadButton::dpad_up()));
_buttons.push_back(ButtonState(GamepadButton::dpad_down()));
// Emulate D-Pad buttons if necessary.
if (i == ABS_HAT0X && emulate_dpad) {
_dpad_x_axis = i;
_dpad_left_button = (int)_buttons.size();
_buttons.push_back(ButtonState(GamepadButton::dpad_left()));
_buttons.push_back(ButtonState(GamepadButton::dpad_right()));
} else if (i == ABS_HAT0Y && emulate_dpad) {
_dpad_y_axis = i;
_dpad_up_button = (int)_buttons.size();
_buttons.push_back(ButtonState(GamepadButton::dpad_up()));
_buttons.push_back(ButtonState(GamepadButton::dpad_down()));
}
} else {
set_control_map(i, axis_map[i]);
}
@ -379,27 +382,30 @@ init_device() {
sprintf(path, "/sys/class/input/event%d/device/device/../product", _index);
FILE *f = fopen(path, "r");
if (f) {
fgets(buffer, sizeof(buffer), f);
buffer[strcspn(buffer, "\r\n")] = 0;
if (buffer[0] != 0) {
_name.assign(buffer);
if (fgets(buffer, sizeof(buffer), f) != NULL) {
buffer[strcspn(buffer, "\r\n")] = 0;
if (buffer[0] != 0) {
_name.assign(buffer);
}
}
fclose(f);
}
sprintf(path, "/sys/class/input/event%d/device/device/../manufacturer", _index);
f = fopen(path, "r");
if (f) {
fgets(buffer, sizeof(buffer), f);
buffer[strcspn(buffer, "\r\n")] = 0;
_manufacturer.assign(buffer);
if (fgets(buffer, sizeof(buffer), f) != NULL) {
buffer[strcspn(buffer, "\r\n")] = 0;
_manufacturer.assign(buffer);
}
fclose(f);
}
sprintf(path, "/sys/class/input/event%d/device/device/../serial", _index);
f = fopen(path, "r");
if (f) {
fgets(buffer, sizeof(buffer), f);
buffer[strcspn(buffer, "\r\n")] = 0;
_serial_number.assign(buffer);
if (fgets(buffer, sizeof(buffer), f) != NULL) {
buffer[strcspn(buffer, "\r\n")] = 0;
_serial_number.assign(buffer);
}
fclose(f);
}

View File

@ -319,40 +319,47 @@ open_device() {
sprintf(path, "/sys/class/input/js%d/device/id/vendor", _index);
FILE *f = fopen(path, "r");
if (f) {
fscanf(f, "%hx", &_vendor_id);
if (fscanf(f, "%hx", &_vendor_id) < 1) {
_vendor_id = 0;
}
fclose(f);
}
sprintf(path, "/sys/class/input/js%d/device/id/product", _index);
f = fopen(path, "r");
if (f) {
fscanf(f, "%hx", &_product_id);
if (fscanf(f, "%hx", &_product_id) < 1) {
_product_id = 0;
}
fclose(f);
}
char buffer[256];
sprintf(path, "/sys/class/input/js%d/device/device/../product", _index);
f = fopen(path, "r");
if (f) {
fgets(buffer, sizeof(buffer), f);
buffer[strcspn(buffer, "\r\n")] = 0;
if (buffer[0] != 0) {
_name.assign(buffer);
if (fgets(buffer, sizeof(buffer), f) != NULL) {
buffer[strcspn(buffer, "\r\n")] = 0;
if (buffer[0] != 0) {
_name.assign(buffer);
}
}
fclose(f);
}
sprintf(path, "/sys/class/input/js%d/device/device/../manufacturer", _index);
f = fopen(path, "r");
if (f) {
fgets(buffer, sizeof(buffer), f);
buffer[strcspn(buffer, "\r\n")] = 0;
_manufacturer.assign(buffer);
if (fgets(buffer, sizeof(buffer), f) != NULL) {
buffer[strcspn(buffer, "\r\n")] = 0;
_manufacturer.assign(buffer);
}
fclose(f);
}
sprintf(path, "/sys/class/input/js%d/device/device/../serial", _index);
f = fopen(path, "r");
if (f) {
fgets(buffer, sizeof(buffer), f);
buffer[strcspn(buffer, "\r\n")] = 0;
_serial_number.assign(buffer);
if (fgets(buffer, sizeof(buffer), f) != NULL) {
buffer[strcspn(buffer, "\r\n")] = 0;
_serial_number.assign(buffer);
}
fclose(f);
}