Module: wine Branch: master Commit: 736d03c8da58268564f851d9be2c2c077b88c80b URL: http://source.winehq.org/git/wine.git/?a=commit;h=736d03c8da58268564f851d9be...
Author: Vitaliy Margolen wine-patches@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++)