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