Vitaliy Margolen : dinput: [joystick_linux] Copy and modify default data format.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jan 11 05:34:03 CST 2007


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

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Tue Jan  9 13:43:47 2007 -0700

dinput: [joystick_linux] Copy and modify default data format.

Copy only what we have.

---

 dlls/dinput/joystick_linux.c |   40 ++++++++++++++++++++++++++++++++--------
 1 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c
index 91ee183..e4a891d 100644
--- a/dlls/dinput/joystick_linux.c
+++ b/dlls/dinput/joystick_linux.c
@@ -396,6 +396,8 @@ static HRESULT alloc_device(REFGUID rgui
     JoystickImpl* newDevice;
     char name[MAX_PATH];
     HRESULT hr;
+    LPDIDATAFORMAT df = NULL;
+    int idx = 0;
 
     newDevice = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(JoystickImpl));
     if (newDevice == 0) {
@@ -464,6 +466,31 @@ static HRESULT alloc_device(REFGUID rgui
             newDevice->axis_map[i] = i;
     }
 
+    /* Create copy of default data format */
+    if (!(df = HeapAlloc(GetProcessHeap(), 0, c_dfDIJoystick2.dwSize))) goto FAILED;
+    memcpy(df, &c_dfDIJoystick2, c_dfDIJoystick2.dwSize);
+
+    /* Axes include POVs */
+    df->dwNumObjs = newDevice->axes + newDevice->buttons;
+    if (!(df->rgodf = HeapAlloc(GetProcessHeap(), 0, df->dwNumObjs * df->dwObjSize))) goto FAILED;
+
+    for (i = 0; i < newDevice->axes; i++)
+    {
+        int wine_obj = newDevice->axis_map[i];
+
+        memcpy(&df->rgodf[idx], &c_dfDIJoystick2.rgodf[wine_obj], df->dwObjSize);
+        if (wine_obj < 8)
+            df->rgodf[idx++].dwType = DIDFT_MAKEINSTANCE(wine_obj) | DIDFT_ABSAXIS;
+        else
+            df->rgodf[idx++].dwType = DIDFT_MAKEINSTANCE(wine_obj - 8) | DIDFT_POV;
+    }
+    for (i = 0; i < newDevice->buttons; i++)
+    {
+        memcpy(&df->rgodf[idx], &c_dfDIJoystick2.rgodf[i + 12], df->dwObjSize);
+        df->rgodf[idx++].dwType = DIDFT_MAKEINSTANCE(i) | DIDFT_PSHBUTTON;
+    }
+    newDevice->base.data_format.wine_df = df;
+
     /* create default properties */
     newDevice->props = HeapAlloc(GetProcessHeap(),0,c_dfDIJoystick2.dwNumObjs*sizeof(ObjProps));
     if (newDevice->props == 0)
@@ -477,13 +504,6 @@ static HRESULT alloc_device(REFGUID rgui
         newDevice->props[i].lSaturation = 0;
     }
 
-    /* wine uses DIJOYSTATE2 as it's internal format */
-    newDevice->base.data_format.wine_df = &c_dfDIJoystick2;
-
-    /* create the default transform filter */
-    hr = create_DataFormat(&c_dfDIJoystick2, &newDevice->base.data_format);
-    if (hr != DI_OK) goto FAILED;
-
     IDirectInput_AddRef((LPDIRECTINPUTDEVICE8A)newDevice->dinput);
 
     newDevice->devcaps.dwSize = sizeof(newDevice->devcaps);
@@ -499,7 +519,7 @@ static HRESULT alloc_device(REFGUID rgui
     newDevice->devcaps.dwFFDriverVersion = 0;
 
     if (TRACE_ON(dinput)) {
-        _dump_DIDATAFORMAT(newDevice->base.data_format.user_df);
+        _dump_DIDATAFORMAT(newDevice->base.data_format.wine_df);
        for (i = 0; i < (newDevice->axes); i++)
            TRACE("axis_map[%d] = %d\n", i, newDevice->axis_map[i]);
         _dump_DIDEVCAPS(&newDevice->devcaps);
@@ -512,6 +532,8 @@ static HRESULT alloc_device(REFGUID rgui
 FAILED:
     hr = DIERR_OUTOFMEMORY;
 FAILED1:
+    if (df) HeapFree(GetProcessHeap(), 0, df->rgodf);
+    HeapFree(GetProcessHeap(), 0, df);
     release_DataFormat(&newDevice->base.data_format);
     HeapFree(GetProcessHeap(),0,newDevice->axis_map);
     HeapFree(GetProcessHeap(),0,newDevice->name);
@@ -610,6 +632,8 @@ static ULONG WINAPI JoystickAImpl_Releas
     HeapFree(GetProcessHeap(), 0, This->props);
 
     /* release the data transform filter */
+    HeapFree(GetProcessHeap(), 0, (LPVOID)This->base.data_format.wine_df->rgodf);
+    HeapFree(GetProcessHeap(), 0, (LPVOID)This->base.data_format.wine_df);
     release_DataFormat(&This->base.data_format);
 
     This->base.crit.DebugInfo->Spare[0] = 0;




More information about the wine-cvs mailing list