mirror of https://github.com/encounter/SDL.git
Fixed double-copy of the report in BlueZ >= 5.56
This commit is contained in:
parent
7ed7644a26
commit
7d66fa209a
|
@ -843,19 +843,23 @@ int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char
|
|||
int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length)
|
||||
{
|
||||
int res;
|
||||
unsigned char report = data[0];
|
||||
|
||||
/* It looks like HIDIOCGFEATURE() on Bluetooth LE devices doesn't return the report number */
|
||||
if (dev->needs_ble_hack) {
|
||||
data[1] = data[0];
|
||||
++data;
|
||||
--length;
|
||||
}
|
||||
res = ioctl(dev->device_handle, HIDIOCGFEATURE(length), data);
|
||||
if (res < 0)
|
||||
perror("ioctl (GFEATURE)");
|
||||
else if (dev->needs_ble_hack)
|
||||
else if (dev->needs_ble_hack) {
|
||||
/* Versions of BlueZ before 5.56 don't include the report in the data, and versions of BlueZ >= 5.56 include 2 copies of the report.
|
||||
* We'll fix it so that there is a single copy of the report in both cases
|
||||
*/
|
||||
if (data[0] == report && data[1] == report) {
|
||||
memmove(&data[0], &data[1], res);
|
||||
} else if (data[0] != report) {
|
||||
memmove(&data[1], &data[0], res);
|
||||
data[0] = report;
|
||||
++res;
|
||||
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue