Lucas Fialho Zawacki : dinput: EnumDevicesBySemantics enumerate joysticks with priority flags.
Alexandre Julliard
julliard at winehq.org
Fri Jul 22 10:15:57 CDT 2011
Module: wine
Branch: master
Commit: 6e098f90a6ec5bc9cec657996569ec2418d04ca8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6e098f90a6ec5bc9cec657996569ec2418d04ca8
Author: Lucas Fialho Zawacki <lfzawacki at gmail.com>
Date: Thu Jul 21 15:36:00 2011 -0300
dinput: EnumDevicesBySemantics enumerate joysticks with priority flags.
---
dlls/dinput/dinput_main.c | 50 ++++++++++++++++++++++++++++++++------------
1 files changed, 36 insertions(+), 14 deletions(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index b653307..37b4673 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -317,6 +317,38 @@ void _copy_diactionformatWtoA(LPDIACTIONFORMATA to, LPDIACTIONFORMATW from)
}
}
+/* _diactionformat_priority
+ *
+ * Given a DIACTIONFORMAT structure and a DI genre, returns the enumeration
+ * priority. Joysticks should pass the game genre, and mouse or keyboard their
+ * respective DI*_MASK
+ */
+static DWORD _diactionformat_priorityA(LPDIACTIONFORMATA lpdiaf, DWORD genre)
+{
+ int i;
+ DWORD priorityFlags = 0;
+
+ /* If there's at least one action for the device it's priority 1 */
+ for(i=0; i < lpdiaf->dwActionSize; i++)
+ if ((lpdiaf->rgoAction[i].dwSemantic & genre) == genre)
+ priorityFlags |= DIEDBS_MAPPEDPRI1;
+
+ return priorityFlags;
+}
+
+static DWORD _diactionformat_priorityW(LPDIACTIONFORMATW lpdiaf, DWORD genre)
+{
+ int i;
+ DWORD priorityFlags = 0;
+
+ /* If there's at least one action for the device it's priority 1 */
+ for(i=0; i < lpdiaf->dwActionSize; i++)
+ if ((lpdiaf->rgoAction[i].dwSemantic & genre) == genre)
+ priorityFlags |= DIEDBS_MAPPEDPRI1;
+
+ return priorityFlags;
+}
+
/******************************************************************************
* IDirectInputA_EnumDevices
*/
@@ -877,7 +909,7 @@ static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics(
{
TRACE(" - checking device %u ('%s')\n", i, dinput_devices[i]->name);
- callbackFlags = 0;
+ callbackFlags = _diactionformat_priorityA(lpdiActionFormat, lpdiActionFormat->dwGenre);
/* 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)
@@ -895,16 +927,11 @@ static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics(
/* Enumerate keyboard and mouse */
for(i=0; i < sizeof(guids)/sizeof(guids[0]); i++)
{
- callbackFlags = 0;
+ callbackFlags = _diactionformat_priorityA(lpdiActionFormat, actionMasks[i]);
IDirectInput_CreateDevice(iface, guids[i], &lpdid, NULL);
IDirectInputDevice_GetDeviceInfo(lpdid, &didevi);
- /* If there's at least one action for the device it's priority 1 */
- for(j=0; j < lpdiActionFormat->dwActionSize; j++)
- if ((lpdiActionFormat->rgoAction[j].dwSemantic & actionMasks[i]) == actionMasks[i])
- callbackFlags |= DIEDBS_MAPPEDPRI1;
-
if (lpCallback(&didevi, lpdid, callbackFlags, sizeof(guids)/sizeof(guids[0]) - (i+1), pvRef) == DIENUM_STOP)
return DI_OK;
}
@@ -942,7 +969,7 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics(
{
TRACE(" - checking device %u ('%s')\n", i, dinput_devices[i]->name);
- callbackFlags = 0;
+ callbackFlags = _diactionformat_priorityW(lpdiActionFormat, lpdiActionFormat->dwGenre);
/* 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)
@@ -960,16 +987,11 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics(
/* Enumerate keyboard and mouse */
for(i=0; i < sizeof(guids)/sizeof(guids[0]); i++)
{
- callbackFlags = 0;
+ callbackFlags = _diactionformat_priorityW(lpdiActionFormat, actionMasks[i]);
IDirectInput_CreateDevice(iface, guids[i], &lpdid, NULL);
IDirectInputDevice_GetDeviceInfo(lpdid, &didevi);
- /* If there's at least one action for the device it's priority 1 */
- for(j=0; j < lpdiActionFormat->dwActionSize; j++)
- if ((lpdiActionFormat->rgoAction[j].dwSemantic & actionMasks[i]) == actionMasks[i])
- callbackFlags |= DIEDBS_MAPPEDPRI1;
-
if (lpCallback(&didevi, lpdid, callbackFlags, sizeof(guids)/sizeof(guids[0]) - (i+1), pvRef) == DIENUM_STOP)
return DI_OK;
}
More information about the wine-cvs
mailing list