Vitaliy Margolen : dinput: Limit number of axes in a different way - map all extra axes to -1.
Alexandre Julliard
julliard at winehq.org
Wed May 7 13:28:10 CDT 2008
Module: wine
Branch: master
Commit: bdbc2783a1b23b80658c74167986cf8cf9538187
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bdbc2783a1b23b80658c74167986cf8cf9538187
Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date: Sat May 3 14:19:57 2008 -0600
dinput: Limit number of axes in a different way - map all extra axes to -1.
We can't stop device from sending us extra axes so have to keep axes mapping
around for them.
---
dlls/dinput/joystick_linux.c | 102 +++++++++++++++++++----------------------
1 files changed, 47 insertions(+), 55 deletions(-)
diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c
index bfb8ba0..a151390 100644
--- a/dlls/dinput/joystick_linux.c
+++ b/dlls/dinput/joystick_linux.c
@@ -289,70 +289,65 @@ static HRESULT setup_dinput_options(JoystickImpl * device)
if (!device->axis_map) return DIERR_OUTOFMEMORY;
if (!get_config_key( hkey, appkey, device->name, buffer, MAX_PATH )) {
+ static const char *axis_names[] = {"X", "Y", "Z", "Rx", "Ry", "Rz",
+ "Slider1", "Slider2",
+ "POV1", "POV2", "POV3", "POV4"};
const char *delim = ",";
char * ptr;
TRACE("\"%s\" = \"%s\"\n", device->name, buffer);
if ((ptr = strtok(buffer, delim)) != NULL) {
do {
- if (strcmp(ptr, "X") == 0) {
- device->axis_map[tokens] = 0;
- axis++;
- } else if (strcmp(ptr, "Y") == 0) {
- device->axis_map[tokens] = 1;
- axis++;
- } else if (strcmp(ptr, "Z") == 0) {
- device->axis_map[tokens] = 2;
- axis++;
- } else if (strcmp(ptr, "Rx") == 0) {
- device->axis_map[tokens] = 3;
- axis++;
- } else if (strcmp(ptr, "Ry") == 0) {
- device->axis_map[tokens] = 4;
- axis++;
- } else if (strcmp(ptr, "Rz") == 0) {
- device->axis_map[tokens] = 5;
- axis++;
- } else if (strcmp(ptr, "Slider1") == 0) {
- device->axis_map[tokens] = 6;
- axis++;
- } else if (strcmp(ptr, "Slider2") == 0) {
- device->axis_map[tokens] = 7;
- axis++;
- } else if (strcmp(ptr, "POV1") == 0) {
- device->axis_map[tokens++] = 8;
- device->axis_map[tokens] = 8;
- pov++;
- } else if (strcmp(ptr, "POV2") == 0) {
- device->axis_map[tokens++] = 9;
- device->axis_map[tokens] = 9;
- pov++;
- } else if (strcmp(ptr, "POV3") == 0) {
- device->axis_map[tokens++] = 10;
- device->axis_map[tokens] = 10;
- pov++;
- } else if (strcmp(ptr, "POV4") == 0) {
- device->axis_map[tokens++] = 11;
- device->axis_map[tokens] = 11;
- pov++;
- } else {
- ERR("invalid joystick axis type: %s\n", ptr);
- device->axis_map[tokens] = tokens;
- axis++;
+ int i;
+
+ for (i = 0; i < sizeof(axis_names) / sizeof(axis_names[0]); i++)
+ if (!strcmp(ptr, axis_names[i]))
+ {
+ if (!strncmp(ptr, "POV", 3))
+ {
+ if (pov >= 4)
+ {
+ WARN("Only 4 POVs supported - ignoring extra\n");
+ i = -1;
+ }
+ else
+ {
+ /* Pov takes two axes */
+ device->axis_map[tokens++] = i;
+ pov++;
+ }
+ }
+ else
+ {
+ if (axis >= 8)
+ {
+ FIXME("Only 8 Axes supported - ignoring extra\n");
+ i = -1;
+ }
+ else
+ axis++;
+ }
+ break;
+ }
+
+ if (i == sizeof(axis_names) / sizeof(axis_names[0]))
+ {
+ ERR("invalid joystick axis type: \"%s\"\n", ptr);
+ i = -1;
}
+ device->axis_map[tokens] = i;
tokens++;
} while ((ptr = strtok(NULL, delim)) != NULL);
- if (tokens != device->devcaps.dwAxes) {
+ if (tokens != device->axes) {
ERR("not all joystick axes mapped: %d axes(%d,%d), %d arguments\n", device->axes, axis, pov,tokens);
while (tokens < device->axes) {
- device->axis_map[tokens] = tokens;
+ device->axis_map[tokens] = -1;
tokens++;
}
}
}
-
}
else
{
@@ -360,11 +355,13 @@ static HRESULT setup_dinput_options(JoystickImpl * device)
{
if (tokens < 8)
device->axis_map[tokens] = axis++;
- else
+ else if (tokens < 16)
{
device->axis_map[tokens++] = 8 + pov;
device->axis_map[tokens ] = 8 + pov++;
}
+ else
+ device->axis_map[tokens] = -1;
}
}
device->devcaps.dwAxes = axis;
@@ -433,13 +430,6 @@ static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *di
}
#endif
- if (newDevice->axes > 16)
- {
- /* There are 24 more axes for velocity that we can use */
- FIXME("Can't support %d axes. Clamping down to 16\n", newDevice->axes);
- newDevice->axes = 16;
- }
-
if (newDevice->devcaps.dwButtons > 128)
{
WARN("Can't support %d buttons. Clamping down to 128\n", newDevice->devcaps.dwButtons);
@@ -472,6 +462,8 @@ static HRESULT alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *di
{
int wine_obj = newDevice->axis_map[i];
+ if (wine_obj < 0) continue;
+
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;
More information about the wine-cvs
mailing list