Fixed issue where the throttle and other axes on racing wheels don't start at zero and show up as immediate input when the wheel is turned for the first time. Wait until they are actually moved before generating input from them.
This commit is contained in:
parent
88c9dd30ad
commit
5ea622c38f
3 changed files with 35 additions and 35 deletions
|
@ -170,20 +170,16 @@ SDL_JoystickOpen(int device_index)
|
|||
joystick->name = NULL;
|
||||
|
||||
if (joystick->naxes > 0) {
|
||||
joystick->axes = (Sint16 *) SDL_malloc(joystick->naxes * sizeof(Sint16));
|
||||
joystick->axes_zero = (Sint16 *) SDL_malloc(joystick->naxes * sizeof(Sint16));
|
||||
joystick->axes = (SDL_JoystickAxisInfo *) SDL_calloc(joystick->naxes, sizeof(SDL_JoystickAxisInfo));
|
||||
}
|
||||
if (joystick->nhats > 0) {
|
||||
joystick->hats = (Uint8 *) SDL_malloc
|
||||
(joystick->nhats * sizeof(Uint8));
|
||||
joystick->hats = (Uint8 *) SDL_calloc(joystick->nhats, sizeof(Uint8));
|
||||
}
|
||||
if (joystick->nballs > 0) {
|
||||
joystick->balls = (struct balldelta *) SDL_malloc
|
||||
(joystick->nballs * sizeof(*joystick->balls));
|
||||
joystick->balls = (struct balldelta *) SDL_calloc(joystick->nballs, sizeof(*joystick->balls));
|
||||
}
|
||||
if (joystick->nbuttons > 0) {
|
||||
joystick->buttons = (Uint8 *) SDL_malloc
|
||||
(joystick->nbuttons * sizeof(Uint8));
|
||||
joystick->buttons = (Uint8 *) SDL_calloc(joystick->nbuttons, sizeof(Uint8));
|
||||
}
|
||||
if (((joystick->naxes > 0) && !joystick->axes)
|
||||
|| ((joystick->nhats > 0) && !joystick->hats)
|
||||
|
@ -194,20 +190,6 @@ SDL_JoystickOpen(int device_index)
|
|||
SDL_UnlockJoystickList();
|
||||
return NULL;
|
||||
}
|
||||
if (joystick->axes) {
|
||||
SDL_memset(joystick->axes, 0, joystick->naxes * sizeof(Sint16));
|
||||
SDL_memset(joystick->axes_zero, 0, joystick->naxes * sizeof(Sint16));
|
||||
}
|
||||
if (joystick->hats) {
|
||||
SDL_memset(joystick->hats, 0, joystick->nhats * sizeof(Uint8));
|
||||
}
|
||||
if (joystick->balls) {
|
||||
SDL_memset(joystick->balls, 0,
|
||||
joystick->nballs * sizeof(*joystick->balls));
|
||||
}
|
||||
if (joystick->buttons) {
|
||||
SDL_memset(joystick->buttons, 0, joystick->nbuttons * sizeof(Uint8));
|
||||
}
|
||||
joystick->epowerlevel = SDL_JOYSTICK_POWER_UNKNOWN;
|
||||
|
||||
/* Add joystick to list */
|
||||
|
@ -302,7 +284,7 @@ SDL_JoystickGetAxis(SDL_Joystick * joystick, int axis)
|
|||
return (0);
|
||||
}
|
||||
if (axis < joystick->naxes) {
|
||||
state = joystick->axes[axis];
|
||||
state = joystick->axes[axis].value;
|
||||
} else {
|
||||
SDL_SetError("Joystick only has %d axes", joystick->naxes);
|
||||
state = 0;
|
||||
|
@ -486,7 +468,6 @@ SDL_JoystickClose(SDL_Joystick * joystick)
|
|||
|
||||
/* Free the data associated with this joystick */
|
||||
SDL_free(joystick->axes);
|
||||
SDL_free(joystick->axes_zero);
|
||||
SDL_free(joystick->hats);
|
||||
SDL_free(joystick->balls);
|
||||
SDL_free(joystick->buttons);
|
||||
|
@ -621,22 +602,34 @@ SDL_PrivateJoystickAxis(SDL_Joystick * joystick, Uint8 axis, Sint16 value)
|
|||
if (axis >= joystick->naxes) {
|
||||
return 0;
|
||||
}
|
||||
if (value == joystick->axes[axis]) {
|
||||
if (value == joystick->axes[axis].value) {
|
||||
return 0;
|
||||
}
|
||||
if (!joystick->axes[axis].moved) {
|
||||
if (joystick->axes[axis].intial_value == 0) {
|
||||
joystick->axes[axis].intial_value = value;
|
||||
return 0;
|
||||
}
|
||||
if (value == joystick->axes[axis].intial_value) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* We got more than 0 and the initial value from the joystick, consider it as having actually moved */
|
||||
joystick->axes[axis].moved = SDL_TRUE;
|
||||
}
|
||||
|
||||
/* We ignore events if we don't have keyboard focus, except for centering
|
||||
* events.
|
||||
*/
|
||||
if (SDL_PrivateJoystickShouldIgnoreEvent()) {
|
||||
if ((value > joystick->axes_zero[axis] && value >= joystick->axes[axis]) ||
|
||||
(value < joystick->axes_zero[axis] && value <= joystick->axes[axis])) {
|
||||
if ((value > joystick->axes[axis].zero && value >= joystick->axes[axis].value) ||
|
||||
(value < joystick->axes[axis].zero && value <= joystick->axes[axis].value)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Update internal joystick state */
|
||||
joystick->axes[axis] = value;
|
||||
joystick->axes[axis].value = value;
|
||||
|
||||
/* Post the event, if desired */
|
||||
posted = 0;
|
||||
|
@ -807,7 +800,7 @@ SDL_JoystickUpdate(void)
|
|||
|
||||
/* Tell the app that everything is centered/unpressed... */
|
||||
for (i = 0; i < joystick->naxes; i++) {
|
||||
SDL_PrivateJoystickAxis(joystick, i, joystick->axes_zero[i]);
|
||||
SDL_PrivateJoystickAxis(joystick, i, joystick->axes[i].zero);
|
||||
}
|
||||
|
||||
for (i = 0; i < joystick->nbuttons; i++) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue