From bc5d32bec6c37271769c66dd59c15a5d1aab37ca Mon Sep 17 00:00:00 2001 From: Lucas Fialho Zawacki Date: Mon, 11 Jul 2011 22:37:36 -0300 Subject: [PATCH] dinput: EnumDevicesBySemantics enumerating all kinds of joysticks. --- dlls/dinput/dinput_main.c | 54 +++++++++++++++++++++++++++++++++++-- dlls/dinput8/tests/device.c | 3 +++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c index 0f84e7c8fbb..821a9a0a073 100644 --- a/dlls/dinput/dinput_main.c +++ b/dlls/dinput/dinput_main.c @@ -847,6 +847,7 @@ static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics( IDirectInputImpl *This = impl_from_IDirectInput8A( iface ); DIDEVICEINSTANCEA didevi; LPDIRECTINPUTDEVICE8A lpdid; + DWORD callbackFlags; int i, j; @@ -865,12 +866,36 @@ static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics( didevi.dwSize = sizeof(didevi); + /* Enumerate all the joysticks */ + for (i = 0; i < NB_DINPUT_DEVICES; i++) + { + BOOL enumSuccess; + + if (!dinput_devices[i]->enum_deviceA) continue; + + for (j = 0, enumSuccess = -1; enumSuccess != 0; j++) + { + TRACE(" - checking device %u ('%s')\n", i, dinput_devices[i]->name); + + callbackFlags = 0; + /* Default behavior is to enumerate attached game controllers */ + enumSuccess = dinput_devices[i]->enum_deviceA(DI8DEVCLASS_GAMECTRL, DIEDFL_ATTACHEDONLY | dwFlags, &didevi, This->dwVersion, j); + if (enumSuccess) + { + IDirectInput_CreateDevice(iface, &didevi.guidInstance, &lpdid, NULL); + + if (lpCallback(&didevi, lpdid, callbackFlags, 0, pvRef) == DIENUM_STOP) + return DI_OK; + } + } + } + if (dwFlags & DIEDBSFL_FORCEFEEDBACK) return DI_OK; /* Enumerate keyboard and mouse */ for(i=0; i < sizeof(guids)/sizeof(guids[0]); i++) { - DWORD callbackFlags = 0; + callbackFlags = 0; IDirectInput_CreateDevice(iface, guids[i], &lpdid, NULL); IDirectInputDevice_GetDeviceInfo(lpdid, &didevi); @@ -898,6 +923,7 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics( IDirectInputImpl *This = impl_from_IDirectInput8W(iface); DIDEVICEINSTANCEW didevi; LPDIRECTINPUTDEVICE8W lpdid; + DWORD callbackFlags; int i, j; FIXME("(this=%p,%s,%p,%p,%p,%04x): semi-stub\n", This, debugstr_w(ptszUserName), lpdiActionFormat, @@ -905,12 +931,36 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics( didevi.dwSize = sizeof(didevi); + /* Enumerate all the joysticks */ + for (i = 0; i < NB_DINPUT_DEVICES; i++) + { + BOOL enumSuccess; + + if (!dinput_devices[i]->enum_deviceW) continue; + + for (j = 0, enumSuccess = -1; enumSuccess != 0; j++) + { + TRACE(" - checking device %u ('%s')\n", i, dinput_devices[i]->name); + + callbackFlags = 0; + /* Default behavior is to enumerate attached game controllers */ + enumSuccess = dinput_devices[i]->enum_deviceW(DI8DEVCLASS_GAMECTRL, DIEDFL_ATTACHEDONLY | dwFlags, &didevi, This->dwVersion, j); + if (enumSuccess) + { + IDirectInput_CreateDevice(iface, &didevi.guidInstance, &lpdid, NULL); + + if (lpCallback(&didevi, lpdid, callbackFlags, 0, pvRef) == DIENUM_STOP) + return DI_OK; + } + } + } + if (dwFlags & DIEDBSFL_FORCEFEEDBACK) return DI_OK; /* Enumerate keyboard and mouse */ for(i=0; i < sizeof(guids)/sizeof(guids[0]); i++) { - DWORD callbackFlags = 0; + callbackFlags = 0; IDirectInput_CreateDevice(iface, guids[i], &lpdid, NULL); IDirectInputDevice_GetDeviceInfo(lpdid, &didevi); diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c index 94b1f2d2915..cedad80e1fe 100644 --- a/dlls/dinput8/tests/device.c +++ b/dlls/dinput8/tests/device.c @@ -166,6 +166,9 @@ static BOOL CALLBACK enumeration_callback( hr = IDirectInputDevice8_SetActionMap(lpdid, data->lpdiaf, NULL, 0); ok (SUCCEEDED(hr), "SetActionMap failed hr=%08x\n", hr); + /* Some joysticks may have no suitable actions and thus should not be tested */ + if (hr == DI_NOEFFECT) return DIENUM_CONTINUE; + /* Test buffer size */ memset(&dp, 0, sizeof(dp)); dp.diph.dwSize = sizeof(dp);