[PATCH] dinput : use vendor and product ids to generate product GUID like it's done on Windows - second try

Corentin Rossignon corossig at gmail.com
Fri Jul 22 01:31:08 CDT 2016


Signed-off-by: Corentin Rossignon <corossig at gmail.com>
---
 dlls/dinput/joystick_linuxinput.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index 86f12d0..3f9c241 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -96,6 +96,7 @@ struct JoyDev {
 	char *device;
 	char *name;
 	GUID guid;
+	GUID guid_product;
 
         BOOL has_ff;
         int num_effects;
@@ -293,11 +294,32 @@ static void find_joydevs(void)
 	}
 
         if (ioctl(fd, EVIOCGID, &device_id) == -1)
+        {
             WARN("ioctl(EVIOCGID) failed: %d %s\n", errno, strerror(errno));
+            joydev.guid_product = DInput_Wine_Joystick_Base_GUID;
+        }
         else
         {
             joydev.vendor_id = device_id.vendor;
             joydev.product_id = device_id.product;
+
+            /* Construct the GUID in the same way of Windows doing this.
+               Data1 is concatenation of productid and vendorid.
+               Data2 and Data3 are NULL.
+               Data4 seems to be a constant. */
+            joydev.guid_product.Data1 = (device_id.product << 16) + device_id.vendor;
+            
+            joydev.guid_product.Data2 = 0x0000;
+            joydev.guid_product.Data3 = 0x0000;
+            
+            joydev.guid_product.Data4[0] = 0x00;
+            joydev.guid_product.Data4[1] = 0x00;
+            joydev.guid_product.Data4[2] = 0x50;
+            joydev.guid_product.Data4[3] = 0x49;
+            joydev.guid_product.Data4[4] = 0x44;
+            joydev.guid_product.Data4[5] = 0x56;
+            joydev.guid_product.Data4[6] = 0x49;
+            joydev.guid_product.Data4[7] = 0x44;
         }
 
         if (!have_joydevs)
@@ -327,7 +349,7 @@ static void fill_joystick_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, DWORD ver
 
     lpddi->dwSize       = dwSize;
     lpddi->guidInstance = joydevs[id].guid;
-    lpddi->guidProduct  = DInput_Wine_Joystick_Base_GUID;
+    lpddi->guidProduct  = joydevs[id].guid_product;
     lpddi->guidFFDriver = GUID_NULL;
 
     if (version >= 0x0800)
@@ -348,7 +370,7 @@ static void fill_joystick_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD ver
 
     lpddi->dwSize       = dwSize;
     lpddi->guidInstance = joydevs[id].guid;
-    lpddi->guidProduct  = DInput_Wine_Joystick_Base_GUID;
+    lpddi->guidProduct  = joydevs[id].guid_product;
     lpddi->guidFFDriver = GUID_NULL;
 
     if (version >= 0x0800)
-- 
2.9.0




More information about the wine-devel mailing list