Lucas Fialho Zawacki : dinput: EnumDevicesBySemantics enumerating keyboard and mouse with priority flags.
Alexandre Julliard
julliard at winehq.org
Tue Jun 28 17:25:18 CDT 2011
Module: wine
Branch: master
Commit: 0f17c828f7381ddd606e17347a7ee32347c167fd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0f17c828f7381ddd606e17347a7ee32347c167fd
Author: Lucas Fialho Zawacki <lfzawacki at gmail.com>
Date: Tue Jun 28 13:54:36 2011 -0300
dinput: EnumDevicesBySemantics enumerating keyboard and mouse with priority flags.
---
dlls/dinput/dinput_main.c | 73 +++++++++++++++++++++++++++++++++++++++---
dlls/dinput/dinput_private.h | 3 ++
dlls/dinput8/tests/device.c | 10 +++---
3 files changed, 76 insertions(+), 10 deletions(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index d3727bc..c032642 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -681,8 +681,13 @@ static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics(
)
{
IDirectInputImpl *This = impl_from_IDirectInput8A( iface );
+ DIDEVICEINSTANCEA didevi;
+ LPDIRECTINPUTDEVICE8A lpdid;
+ BOOL ret;
+ DWORD callbackFlags = 0;
+ int i;
- FIXME("(this=%p,%s,%p,%p,%p,%04x): stub\n", This, ptszUserName, lpdiActionFormat,
+ FIXME("(this=%p,%s,%p,%p,%p,%04x): semi-stub\n", This, ptszUserName, lpdiActionFormat,
lpCallback, pvRef, dwFlags);
#define X(x) if (dwFlags & x) FIXME("\tdwFlags |= "#x"\n");
X(DIEDBSFL_ATTACHEDONLY)
@@ -695,6 +700,32 @@ static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics(
_dump_diactionformatA(lpdiActionFormat);
+ didevi.dwSize = sizeof(didevi);
+
+ /* enum the keyboard first */
+ IDirectInput_CreateDevice(iface, &GUID_SysKeyboard, &lpdid, NULL);
+ IDirectInputDevice_GetDeviceInfo(lpdid, &didevi);
+ /* if there's any DIKEYBOARD action, keyboard is priority 1*/
+ for(i=0; i < lpdiActionFormat->dwActionSize; i++)
+ if ((lpdiActionFormat->rgoAction[i].dwSemantic & DIKEYBOARD_MASK) == DIKEYBOARD_MASK)
+ callbackFlags |= DIEDBS_MAPPEDPRI1;
+
+ ret = lpCallback(&didevi, lpdid, callbackFlags, 1, pvRef);
+
+ if (ret == DIENUM_STOP) return DI_OK;
+
+ callbackFlags = 0;
+
+ /* and then the mouse */
+ IDirectInput_CreateDevice(iface, &GUID_SysMouse, &lpdid, NULL);
+ IDirectInputDevice_GetDeviceInfo(lpdid, &didevi);
+ /* same as above, but for the mouse */
+ for(i=0; i < lpdiActionFormat->dwActionSize; i++)
+ if ((lpdiActionFormat->rgoAction[i].dwSemantic & DIMOUSE_MASK) == DIMOUSE_MASK)
+ callbackFlags |= DIEDBS_MAPPEDPRI1;
+
+ lpCallback(&didevi, lpdid, callbackFlags, 0, pvRef);
+
return DI_OK;
}
@@ -704,11 +735,43 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics(
LPVOID pvRef, DWORD dwFlags
)
{
- IDirectInputImpl *This = impl_from_IDirectInput8W( iface );
+ IDirectInputImpl *This = impl_from_IDirectInput8W(iface);
+ DIDEVICEINSTANCEW didevi;
+ LPDIRECTINPUTDEVICE8W lpdid;
+ BOOL ret;
+ DWORD callbackFlags = 0;
+ int i;
- FIXME("(this=%p,%s,%p,%p,%p,%04x): stub\n", This, debugstr_w(ptszUserName), lpdiActionFormat,
- lpCallback, pvRef, dwFlags);
- return 0;
+ FIXME("(this=%p,%s,%p,%p,%p,%04x): semi-stub\n", This, debugstr_w(ptszUserName), lpdiActionFormat,
+ lpCallback, pvRef, dwFlags);
+
+ didevi.dwSize = sizeof(didevi);
+
+ /* enum the keyboard first */
+ IDirectInput_CreateDevice(iface, &GUID_SysKeyboard, &lpdid, NULL);
+ IDirectInputDevice_GetDeviceInfo(lpdid, &didevi);
+ /* if there's any DIKEYBOARD action, keyboard is priority 1*/
+ for(i=0; i < lpdiActionFormat->dwActionSize; i++)
+ if ((lpdiActionFormat->rgoAction[i].dwSemantic & DIKEYBOARD_MASK) == DIKEYBOARD_MASK)
+ callbackFlags |= DIEDBS_MAPPEDPRI1;
+
+ ret = lpCallback(&didevi, lpdid, callbackFlags, 1, pvRef);
+
+ if (ret == DIENUM_STOP) return DI_OK;
+
+ callbackFlags = 0;
+
+ /* and then the mouse */
+ IDirectInput_CreateDevice(iface, &GUID_SysMouse, &lpdid, NULL);
+ IDirectInputDevice_GetDeviceInfo(lpdid, &didevi);
+ /* same as above, but for the mouse */
+ for(i=0; i < lpdiActionFormat->dwActionSize; i++)
+ if ((lpdiActionFormat->rgoAction[i].dwSemantic & DIMOUSE_MASK) == DIMOUSE_MASK)
+ callbackFlags |= DIEDBS_MAPPEDPRI1;
+
+ lpCallback(&didevi, lpdid, callbackFlags, 0, pvRef);
+
+ return DI_OK;
}
static HRESULT WINAPI IDirectInput8AImpl_ConfigureDevices(
diff --git a/dlls/dinput/dinput_private.h b/dlls/dinput/dinput_private.h
index 5972081..33cc823 100644
--- a/dlls/dinput/dinput_private.h
+++ b/dlls/dinput/dinput_private.h
@@ -66,4 +66,7 @@ extern void _dump_diactionformatA(LPDIACTIONFORMATA) DECLSPEC_HIDDEN;
#define IS_DIPROP(x) (((ULONG_PTR)(x) >> 16) == 0)
+#define DIKEYBOARD_MASK 0x81000000
+#define DIMOUSE_MASK 0x82000000
+
#endif /* __WINE_DLLS_DINPUT_DINPUT_PRIVATE_H */
diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c
index 992821d..8344486 100644
--- a/dlls/dinput8/tests/device.c
+++ b/dlls/dinput8/tests/device.c
@@ -68,7 +68,7 @@ static BOOL CALLBACK enumeration_callback(
IDirectInputDevice_AddRef(lpdid);
data->keyboard = lpdid;
- todo_wine ok (dwFlags & DIEDBS_MAPPEDPRI1, "Keyboard should be mapped as pri1 dwFlags=%08x\n", dwFlags);
+ ok (dwFlags & DIEDBS_MAPPEDPRI1, "Keyboard should be mapped as pri1 dwFlags=%08x\n", dwFlags);
}
if (IsEqualGUID(&lpddi->guidInstance, &GUID_SysMouse))
@@ -76,7 +76,7 @@ static BOOL CALLBACK enumeration_callback(
IDirectInputDevice_AddRef(lpdid);
data->mouse = lpdid;
- todo_wine ok (dwFlags & DIEDBS_MAPPEDPRI1, "Mouse should be mapped as pri1 dwFlags=%08x\n", dwFlags);
+ ok (dwFlags & DIEDBS_MAPPEDPRI1, "Mouse should be mapped as pri1 dwFlags=%08x\n", dwFlags);
}
return DIENUM_CONTINUE;
@@ -122,9 +122,9 @@ static void test_action_mapping(void)
hr = IDirectInput8_EnumDevicesBySemantics(pDI, 0, &af, enumeration_callback, &data, 0);
ok (SUCCEEDED(hr), "EnumDevicesBySemantics failed: hr=%08x\n", hr);
- todo_wine ok (data.ndevices > 0, "EnumDevicesBySemantics did not call the callback hr=%08x\n", hr);
- todo_wine ok (data.keyboard != NULL, "EnumDevicesBySemantics should enumerate the keyboard\n");
- todo_wine ok (data.mouse != NULL, "EnumDevicesBySemantics should enumerate the mouse\n");
+ ok (data.ndevices > 0, "EnumDevicesBySemantics did not call the callback hr=%08x\n", hr);
+ ok (data.keyboard != NULL, "EnumDevicesBySemantics should enumerate the keyboard\n");
+ ok (data.mouse != NULL, "EnumDevicesBySemantics should enumerate the mouse\n");
/* The call fails with a zeroed GUID */
memset(&af.guidActionMap, 0, sizeof(GUID));
More information about the wine-cvs
mailing list