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

Alexandre Julliard julliard at wine.codeweavers.com
Thu Dec 28 07:40:29 CST 2006


Module: wine
Branch: master
Commit: 42feef0c7bcfa598c8337c61369dfefbf3f7c9fc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=42feef0c7bcfa598c8337c61369dfefbf3f7c9fc

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Wed Dec 27 16:32:19 2006 -0700

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

---

 dlls/dinput/device.c |   66 +++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 52 insertions(+), 14 deletions(-)

diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 31e05a5..da3afa4 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -800,13 +800,49 @@ HRESULT WINAPI IDirectInputDevice2AImpl_
 	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_
 	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_
             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");




More information about the wine-cvs mailing list