static void AddXInputDevice(const Uint8 userid, BYTE SubType, JoyStick_DeviceData **pContext) { JoyStick_DeviceData *pPrevJoystick = NULL; JoyStick_DeviceData *pNewJoystick = *pContext; if (SDL_XInputUseOldJoystickMapping() && SubType != XINPUT_DEVSUBTYPE_GAMEPAD) return; if (SubType == XINPUT_DEVSUBTYPE_UNKNOWN) return; while (pNewJoystick) { if (pNewJoystick->bXInputDevice && (pNewJoystick->XInputUserId == userid) && (pNewJoystick->SubType == SubType)) { /* if we are replacing the front of the list then update it */ if (pNewJoystick == *pContext) { *pContext = pNewJoystick->pNext; } else if (pPrevJoystick) { pPrevJoystick->pNext = pNewJoystick->pNext; } pNewJoystick->pNext = SYS_Joystick; SYS_Joystick = pNewJoystick; return; /* already in the list. */ } pPrevJoystick = pNewJoystick; pNewJoystick = pNewJoystick->pNext; } pNewJoystick = (JoyStick_DeviceData *)SDL_malloc(sizeof(JoyStick_DeviceData)); if (!pNewJoystick) { return; /* better luck next time? */ } SDL_zerop(pNewJoystick); pNewJoystick->joystickname = GetXInputName(userid, SubType); if (!pNewJoystick->joystickname) { SDL_free(pNewJoystick); return; /* better luck next time? */ } pNewJoystick->bXInputDevice = SDL_TRUE; if (SDL_XInputUseOldJoystickMapping()) { SDL_zero(pNewJoystick->guid); } else { pNewJoystick->guid.data[0] = 'x'; pNewJoystick->guid.data[1] = 'i'; pNewJoystick->guid.data[2] = 'n'; pNewJoystick->guid.data[3] = 'p'; pNewJoystick->guid.data[4] = 'u'; pNewJoystick->guid.data[5] = 't'; pNewJoystick->guid.data[6] = SubType; } pNewJoystick->SubType = SubType; pNewJoystick->XInputUserId = userid; SDL_SYS_AddJoystickDevice(pNewJoystick); }
static void AddXInputDevice(Uint8 userid, BYTE SubType, JoyStick_DeviceData **pContext) { Uint16 vendor = 0; Uint16 product = 0; Uint16 version = 0; JoyStick_DeviceData *pPrevJoystick = NULL; JoyStick_DeviceData *pNewJoystick = *pContext; if (SDL_XInputUseOldJoystickMapping() && SubType != XINPUT_DEVSUBTYPE_GAMEPAD) return; if (SubType == XINPUT_DEVSUBTYPE_UNKNOWN) return; while (pNewJoystick) { if (pNewJoystick->bXInputDevice && (pNewJoystick->XInputUserId == userid) && (pNewJoystick->SubType == SubType)) { /* if we are replacing the front of the list then update it */ if (pNewJoystick == *pContext) { *pContext = pNewJoystick->pNext; } else if (pPrevJoystick) { pPrevJoystick->pNext = pNewJoystick->pNext; } pNewJoystick->pNext = SYS_Joystick; SYS_Joystick = pNewJoystick; return; /* already in the list. */ } pPrevJoystick = pNewJoystick; pNewJoystick = pNewJoystick->pNext; } pNewJoystick = (JoyStick_DeviceData *)SDL_malloc(sizeof(JoyStick_DeviceData)); if (!pNewJoystick) { return; /* better luck next time? */ } SDL_zerop(pNewJoystick); pNewJoystick->joystickname = GetXInputName(userid, SubType); if (!pNewJoystick->joystickname) { SDL_free(pNewJoystick); return; /* better luck next time? */ } pNewJoystick->bXInputDevice = SDL_TRUE; if (SDL_XInputUseOldJoystickMapping()) { SDL_zero(pNewJoystick->guid); } else { Uint16 *guid16 = (Uint16 *)pNewJoystick->guid.data; GuessXInputDevice(userid, &vendor, &product, &version); *guid16++ = SDL_SwapLE16(SDL_HARDWARE_BUS_USB); *guid16++ = 0; *guid16++ = SDL_SwapLE16(vendor); *guid16++ = 0; *guid16++ = SDL_SwapLE16(product); *guid16++ = 0; *guid16++ = SDL_SwapLE16(version); *guid16++ = 0; /* Note that this is an XInput device and what subtype it is */ pNewJoystick->guid.data[14] = 'x'; pNewJoystick->guid.data[15] = SubType; } pNewJoystick->SubType = SubType; pNewJoystick->XInputUserId = userid; if (SDL_ShouldIgnoreJoystick(pNewJoystick->joystickname, pNewJoystick->guid)) { SDL_free(pNewJoystick); return; } #ifdef SDL_JOYSTICK_HIDAPI if (HIDAPI_IsDevicePresent(vendor, product, version)) { /* The HIDAPI driver is taking care of this device */ SDL_free(pNewJoystick); return; } #endif WINDOWS_AddJoystickDevice(pNewJoystick); }