Additional DInput code fixes

This commit is contained in:
Henrik Rydgård
2026-05-05 09:18:15 +02:00
parent 8b58cce009
commit 265fe1b8b5
+5 -8
View File
@@ -111,7 +111,9 @@ void DinputDevice::getDevices(bool refresh) {
// We don't want duplicate reporting from XInput devices through DInput.
ignoreDevices_ = DetectXInputVIDPIDs();
HidInputDevice::AddSupportedDevices(&ignoreDevices_);
getPDI()->EnumDevices(DI8DEVCLASS_GAMECTRL, &DinputDevice::DevicesCallback, NULL, DIEDFL_ATTACHEDONLY);
if (getPDI()) {
getPDI()->EnumDevices(DI8DEVCLASS_GAMECTRL, &DinputDevice::DevicesCallback, NULL, DIEDFL_ATTACHEDONLY);
}
}
}
@@ -263,7 +265,7 @@ int DinputDevice::UpdateState() {
DIJOYSTATE2 js{};
if (FAILED(pJoystick->Poll())) {
if(pJoystick->Acquire() == DIERR_INPUTLOST)
if (FAILED(pJoystick->Acquire()))
return -1;
}
@@ -273,10 +275,6 @@ int DinputDevice::UpdateState() {
ApplyButtons(js);
if (analog) {
// TODO: Use the batched interface.
AxisInput axis;
axis.deviceId = DEVICE_ID_PAD_0 + pDevNum;
SendNativeAxis(DEVICE_ID_PAD_0 + pDevNum, js.lX, last_lX_, JOYSTICK_AXIS_X);
SendNativeAxis(DEVICE_ID_PAD_0 + pDevNum, js.lY, last_lY_, JOYSTICK_AXIS_Y);
SendNativeAxis(DEVICE_ID_PAD_0 + pDevNum, js.lZ, last_lZ_, JOYSTICK_AXIS_Z);
@@ -300,7 +298,6 @@ int DinputDevice::UpdateState() {
void DinputDevice::ApplyButtons(DIJOYSTATE2 &state) {
const bool sendInput = g_Config.bAllowDInput;
BYTE *buttons = state.rgbButtons;
u32 downMask = 0x80;
for (int i = 0; i < ARRAY_SIZE(dinput_buttons); ++i) {
@@ -393,7 +390,7 @@ static std::set<u32> DetectXInputVIDPIDs() {
VARIANT var{};
if (SUCCEEDED(pDevices[i]->Get(L"DeviceID", 0, &var, nullptr, nullptr)))
{
if (wcsstr(var.bstrVal, L"IG_"))
if (var.vt == VT_BSTR && var.bstrVal != nullptr && wcsstr(var.bstrVal, L"IG_"))
{
DWORD vid = 0, pid = 0;
const WCHAR *strVid = wcsstr(var.bstrVal, L"VID_");