diff --git a/src/joystick/SDL_gamecontroller.c b/src/joystick/SDL_gamecontroller.c index e41bae6cc9..a9c8e826d1 100644 --- a/src/joystick/SDL_gamecontroller.c +++ b/src/joystick/SDL_gamecontroller.c @@ -1132,12 +1132,12 @@ SDL_GameControllerOpen(int device_index) int leftTriggerMapping = gamecontroller->mapping.axes[SDL_CONTROLLER_AXIS_TRIGGERLEFT]; int rightTriggerMapping = gamecontroller->mapping.axes[SDL_CONTROLLER_AXIS_TRIGGERRIGHT]; if (leftTriggerMapping >= 0) { - gamecontroller->joystick->axes[leftTriggerMapping] = - gamecontroller->joystick->axes_zero[leftTriggerMapping] = (Sint16)-32768; + gamecontroller->joystick->axes[leftTriggerMapping].value = + gamecontroller->joystick->axes[leftTriggerMapping].zero = (Sint16)-32768; } if (rightTriggerMapping >= 0) { - gamecontroller->joystick->axes[rightTriggerMapping] = - gamecontroller->joystick->axes_zero[rightTriggerMapping] = (Sint16)-32768; + gamecontroller->joystick->axes[rightTriggerMapping].value = + gamecontroller->joystick->axes[rightTriggerMapping].zero = (Sint16)-32768; } } diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c index 422457003b..663f44972a 100644 --- a/src/joystick/SDL_joystick.c +++ b/src/joystick/SDL_joystick.c @@ -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++) { diff --git a/src/joystick/SDL_sysjoystick.h b/src/joystick/SDL_sysjoystick.h index 4c7ba045b6..c24dc24256 100644 --- a/src/joystick/SDL_sysjoystick.h +++ b/src/joystick/SDL_sysjoystick.h @@ -29,14 +29,21 @@ #include "SDL_joystick_c.h" /* The SDL joystick structure */ +typedef struct _SDL_JoystickAxisInfo +{ + Sint16 value; /* Current axis states */ + Sint16 zero; /* Zero point on the axis (-32768 for triggers) */ + Sint16 intial_value; /* The very first value we saw on this axis */ + SDL_bool moved; /* Whether the axis has moved */ +} SDL_JoystickAxisInfo; + struct _SDL_Joystick { SDL_JoystickID instance_id; /* Device instance, monotonically increasing from 0 */ char *name; /* Joystick name - system dependent */ int naxes; /* Number of axis controls on the joystick */ - Sint16 *axes; /* Current axis states */ - Sint16 *axes_zero; /* Zero point on the axis (-32768 for triggers) */ + SDL_JoystickAxisInfo *axes; int nhats; /* Number of hats on the joystick */ Uint8 *hats; /* Current hat states */