[Mac] Implement Joystick.GetGuid()

This commit is contained in:
thefiddler 2014-01-05 22:15:55 +01:00
parent 5c5afb3ea3
commit 9e223486f6

View file

@ -395,7 +395,7 @@ namespace OpenTK.Platform.MacOS
#region Joystick #region Joystick
Guid CreateJoystickGuid(IntPtr device) Guid CreateJoystickGuid(IntPtr device, string name)
{ {
// Create a device guid from the product and vendor id keys // Create a device guid from the product and vendor id keys
List<byte> guid_bytes = new List<byte>(); List<byte> guid_bytes = new List<byte>();
@ -413,8 +413,26 @@ namespace OpenTK.Platform.MacOS
CF.CFNumberGetValue(product_id_ref, CF.CFNumberType.kCFNumberLongType, out product_id); CF.CFNumberGetValue(product_id_ref, CF.CFNumberType.kCFNumberLongType, out product_id);
} }
guid_bytes.AddRange(BitConverter.GetBytes(vendor_id)); if (vendor_id != 0 && product_id != 0)
guid_bytes.AddRange(BitConverter.GetBytes(product_id)); {
guid_bytes.AddRange(BitConverter.GetBytes(vendor_id));
guid_bytes.AddRange(BitConverter.GetBytes(product_id));
}
else
{
// Bluetooth devices don't have USB vendor/product id keys.
// Match SDL2 algorithm for compatibility.
guid_bytes.Add(0x05); // BUS_BLUETOOTH
guid_bytes.Add(0x00);
guid_bytes.Add(0x00);
guid_bytes.Add(0x00);
// Copy the first 12 bytes of the product name
byte[] name_bytes = new byte[12];
Array.Copy(System.Text.Encoding.UTF8.GetBytes(name), name_bytes, name_bytes.Length);
guid_bytes.AddRange(name_bytes);
}
return new Guid(guid_bytes.ToArray()); return new Guid(guid_bytes.ToArray());
} }
@ -430,11 +448,11 @@ namespace OpenTK.Platform.MacOS
int buttons = 0; int buttons = 0;
int dpads = 0; int dpads = 0;
Guid guid = CreateJoystickGuid(device);
CFStringRef name_ref = NativeMethods.IOHIDDeviceGetProperty(device, NativeMethods.IOHIDProductKey); CFStringRef name_ref = NativeMethods.IOHIDDeviceGetProperty(device, NativeMethods.IOHIDProductKey);
string name = CF.CFStringGetCString(name_ref); string name = CF.CFStringGetCString(name_ref);
Guid guid = CreateJoystickGuid(device, name);
List<int> button_elements = new List<int>(); List<int> button_elements = new List<int>();
CFArray element_array = new CFArray(element_array_ref); CFArray element_array = new CFArray(element_array_ref);
for (int i = 0; i < element_array.Count; i++) for (int i = 0; i < element_array.Count; i++)