dinput: Implement EnumOjects[A|W] in the base device class.

This commit is contained in:
Vitaliy Margolen 2006-12-27 16:32:19 -07:00 committed by Alexandre Julliard
parent 18ee811e4c
commit 42feef0c7b
1 changed files with 52 additions and 14 deletions

View File

@ -800,13 +800,49 @@ HRESULT WINAPI IDirectInputDevice2AImpl_EnumObjects(
LPVOID lpvRef,
DWORD dwFlags)
{
FIXME("(this=%p,%p,%p,%08x): stub!\n", iface, lpCallback, lpvRef, dwFlags);
if (TRACE_ON(dinput)) {
DPRINTF(" - flags = ");
_dump_EnumObjects_flags(dwFlags);
DPRINTF("\n");
IDirectInputDevice2AImpl *This = (IDirectInputDevice2AImpl *)iface;
DIDEVICEOBJECTINSTANCEA ddoi;
int i, axis = 0, button = 0;
TRACE("(%p) %p,%p flags:%08x)\n", iface, lpCallback, lpvRef, dwFlags);
TRACE(" - flags = ");
_dump_EnumObjects_flags(dwFlags);
TRACE("\n");
/* Only the fields till dwFFMaxForce are relevant */
memset(&ddoi, 0, sizeof(ddoi));
ddoi.dwSize = FIELD_OFFSET(DIDEVICEOBJECTINSTANCEA, dwFFMaxForce);
for (i = 0; i < This->data_format.wine_df->dwNumObjs; i++)
{
LPDIOBJECTDATAFORMAT odf;
DWORD type;
odf = (LPDIOBJECTDATAFORMAT)((LPBYTE)This->data_format.wine_df->rgodf +
i * This->data_format.wine_df->dwObjSize);
type = DIEFT_GETTYPE(odf->dwType);
if (type & DIDFT_AXIS) axis++;
else if (type & DIDFT_BUTTON) button++;
if (dwFlags != DIDFT_ALL && !(dwFlags & type)) continue;
ddoi.guidType = *odf->pguid;
ddoi.dwType = odf->dwType;
ddoi.dwFlags = odf->dwFlags;
ddoi.dwOfs = !This->data_format.offsets ? odf->dwOfs : This->data_format.offsets[i];
if (IsEqualGUID(&ddoi.guidType, &GUID_XAxis)) strcpy(ddoi.tszName, "X-Axis");
else if (IsEqualGUID(&ddoi.guidType, &GUID_YAxis)) strcpy(ddoi.tszName, "Y-Axis");
else if (IsEqualGUID(&ddoi.guidType, &GUID_ZAxis)) strcpy(ddoi.tszName, "Z-Axis");
else if (type & DIDFT_AXIS) wsprintfA(ddoi.tszName, "%d-Axis", axis - 1);
else if (type & DIDFT_BUTTON) wsprintfA(ddoi.tszName, "Button %d", button - 1);
else FIXME("no name\n");
_dump_OBJECTINSTANCEA(&ddoi);
if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) break;
}
return DI_OK;
}
@ -816,14 +852,15 @@ HRESULT WINAPI IDirectInputDevice2WImpl_EnumObjects(
LPVOID lpvRef,
DWORD dwFlags)
{
FIXME("(this=%p,%p,%p,%08x): stub!\n", iface, lpCallback, lpvRef, dwFlags);
if (TRACE_ON(dinput)) {
DPRINTF(" - flags = ");
_dump_EnumObjects_flags(dwFlags);
DPRINTF("\n");
}
return DI_OK;
device_enumobjects_AtoWcb_data data;
data.lpCallBack = lpCallback;
data.lpvRef = lpvRef;
return IDirectInputDevice2AImpl_EnumObjects(
(LPDIRECTINPUTDEVICE8A) iface,
(LPDIENUMDEVICEOBJECTSCALLBACKA) DIEnumDevicesCallbackAtoW,
(LPVOID) &data, dwFlags);
}
/******************************************************************************
@ -884,6 +921,7 @@ HRESULT WINAPI IDirectInputDevice2AImpl_SetProperty(
if (pdiph->dwHow == DIPH_DEVICE && pdiph->dwObj) return DIERR_INVALIDPARAM;
if (This->acquired) return DIERR_ACQUIRED;
if (pdiph->dwHow != DIPH_DEVICE) return DIERR_UNSUPPORTED;
if (!This->data_format.user_df) return DI_OK;
TRACE("Axis mode: %s\n", pd->dwData == DIPROPAXISMODE_ABS ? "absolute" :
"relative");