Module: wine Branch: master Commit: bc5d32bec6c37271769c66dd59c15a5d1aab37ca URL: http://source.winehq.org/git/wine.git/?a=commit;h=bc5d32bec6c37271769c66dd59...
Author: Lucas Fialho Zawacki lfzawacki@gmail.com Date: Mon Jul 11 22:37:36 2011 -0300
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 0f84e7c..821a9a0 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 94b1f2d..cedad80 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);