Signed-off-by: Corentin Rossignon corossig@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)