Vitaliy Margolen : dinput: Fix default axes mapping generation.

Alexandre Julliard julliard at winehq.org
Mon Apr 28 08:01:38 CDT 2008


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

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Sun Apr 27 23:01:55 2008 -0600

dinput: Fix default axes mapping generation.

---

 dlls/dinput/joystick_linux.c |   44 +++++++++++++++++++++---------------------
 1 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c
index 46ce4ce..3343bb2 100644
--- a/dlls/dinput/joystick_linux.c
+++ b/dlls/dinput/joystick_linux.c
@@ -271,6 +271,9 @@ static HRESULT setup_dinput_options(JoystickImpl * device)
 {
     char buffer[MAX_PATH+16];
     HKEY hkey, appkey;
+    int tokens = 0;
+    int axis = 0;
+    int pov = 0;
 
     buffer[MAX_PATH]='\0';
 
@@ -283,18 +286,14 @@ static HRESULT setup_dinput_options(JoystickImpl * device)
         TRACE("setting default deadzone to: \"%s\" %d\n", buffer, device->deadzone);
     }
 
+    device->axis_map = HeapAlloc(GetProcessHeap(), 0, device->axes * sizeof(int));
+    if (!device->axis_map) return DIERR_OUTOFMEMORY;
+
     if (!get_config_key( hkey, appkey, device->name, buffer, MAX_PATH )) {
-        int tokens = 0;
-        int axis = 0;
-        int pov = 0;
         const char *delim = ",";
         char * ptr;
         TRACE("\"%s\" = \"%s\"\n", device->name, buffer);
 
-        device->axis_map = HeapAlloc(GetProcessHeap(), 0, device->axes * sizeof(int));
-        if (device->axis_map == 0)
-            return DIERR_OUTOFMEMORY;
-
         if ((ptr = strtok(buffer, delim)) != NULL) {
             do {
                 if (strcmp(ptr, "X") == 0) {
@@ -355,9 +354,22 @@ static HRESULT setup_dinput_options(JoystickImpl * device)
             }
         }
 
-        device->devcaps.dwAxes = axis;
-        device->devcaps.dwPOVs = pov;
     }
+    else
+    {
+        for (tokens = 0; tokens < device->axes; tokens++)
+        {
+            if (tokens < 8)
+                device->axis_map[tokens] = axis++;
+            else
+            {
+                device->axis_map[tokens  ] = 8 + pov;
+                device->axis_map[tokens++] = 8 + pov++;
+            }
+        }
+    }
+    device->devcaps.dwAxes = axis;
+    device->devcaps.dwPOVs = pov;
 
     if (appkey)
         RegCloseKey( appkey );
@@ -445,29 +457,17 @@ static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *di
     /* setup_dinput_options may change these */
     newDevice->deadzone = 0;
     newDevice->devcaps.dwButtons = newDevice->buttons;
-    newDevice->devcaps.dwAxes = newDevice->axes;
-    newDevice->devcaps.dwPOVs = 0;
 
     /* do any user specified configuration */
     hr = setup_dinput_options(newDevice);
     if (hr != DI_OK)
         goto FAILED1;
 
-    if (newDevice->axis_map == 0) {
-        newDevice->axis_map = HeapAlloc(GetProcessHeap(), 0, newDevice->axes * sizeof(int));
-        if (newDevice->axis_map == 0)
-            goto FAILED;
-
-        for (i = 0; i < newDevice->axes; i++)
-            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;
+    df->dwNumObjs = newDevice->devcaps.dwAxes + newDevice->devcaps.dwPOVs + newDevice->buttons;
     if (!(df->rgodf = HeapAlloc(GetProcessHeap(), 0, df->dwNumObjs * df->dwObjSize))) goto FAILED;
 
     for (i = 0; i < newDevice->axes; i++)




More information about the wine-cvs mailing list