Support multiple joystick buttons bound to the same gamepad button

This commit is contained in:
Sam Lantinga
2024-11-05 00:07:27 -08:00
parent 27b828754a
commit ed943318e2

View File

@@ -2741,7 +2741,7 @@ bool SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis)
CHECK_GAMEPAD_MAGIC(gamepad, false); CHECK_GAMEPAD_MAGIC(gamepad, false);
for (i = 0; i < gamepad->num_bindings; ++i) { for (i = 0; i < gamepad->num_bindings; ++i) {
SDL_GamepadBinding *binding = &gamepad->bindings[i]; const SDL_GamepadBinding *binding = &gamepad->bindings[i];
if (binding->output_type == SDL_GAMEPAD_BINDTYPE_AXIS && binding->output.axis.axis == axis) { if (binding->output_type == SDL_GAMEPAD_BINDTYPE_AXIS && binding->output.axis.axis == axis) {
result = true; result = true;
break; break;
@@ -2767,7 +2767,7 @@ Sint16 SDL_GetGamepadAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis)
CHECK_GAMEPAD_MAGIC(gamepad, 0); CHECK_GAMEPAD_MAGIC(gamepad, 0);
for (i = 0; i < gamepad->num_bindings; ++i) { for (i = 0; i < gamepad->num_bindings; ++i) {
SDL_GamepadBinding *binding = &gamepad->bindings[i]; const SDL_GamepadBinding *binding = &gamepad->bindings[i];
if (binding->output_type == SDL_GAMEPAD_BINDTYPE_AXIS && binding->output.axis.axis == axis) { if (binding->output_type == SDL_GAMEPAD_BINDTYPE_AXIS && binding->output.axis.axis == axis) {
int value = 0; int value = 0;
bool valid_input_range; bool valid_input_range;
@@ -2831,7 +2831,7 @@ bool SDL_GamepadHasButton(SDL_Gamepad *gamepad, SDL_GamepadButton button)
CHECK_GAMEPAD_MAGIC(gamepad, false); CHECK_GAMEPAD_MAGIC(gamepad, false);
for (i = 0; i < gamepad->num_bindings; ++i) { for (i = 0; i < gamepad->num_bindings; ++i) {
SDL_GamepadBinding *binding = &gamepad->bindings[i]; const SDL_GamepadBinding *binding = &gamepad->bindings[i];
if (binding->output_type == SDL_GAMEPAD_BINDTYPE_BUTTON && binding->output.button == button) { if (binding->output_type == SDL_GAMEPAD_BINDTYPE_BUTTON && binding->output.button == button) {
result = true; result = true;
break; break;
@@ -2857,7 +2857,7 @@ bool SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL_GamepadButton button)
CHECK_GAMEPAD_MAGIC(gamepad, false); CHECK_GAMEPAD_MAGIC(gamepad, false);
for (i = 0; i < gamepad->num_bindings; ++i) { for (i = 0; i < gamepad->num_bindings; ++i) {
SDL_GamepadBinding *binding = &gamepad->bindings[i]; const SDL_GamepadBinding *binding = &gamepad->bindings[i];
if (binding->output_type == SDL_GAMEPAD_BINDTYPE_BUTTON && binding->output.button == button) { if (binding->output_type == SDL_GAMEPAD_BINDTYPE_BUTTON && binding->output.button == button) {
if (binding->input_type == SDL_GAMEPAD_BINDTYPE_AXIS) { if (binding->input_type == SDL_GAMEPAD_BINDTYPE_AXIS) {
bool valid_input_range; bool valid_input_range;
@@ -2867,23 +2867,19 @@ bool SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL_GamepadButton button)
if (binding->input.axis.axis_min < binding->input.axis.axis_max) { if (binding->input.axis.axis_min < binding->input.axis.axis_max) {
valid_input_range = (value >= binding->input.axis.axis_min && value <= binding->input.axis.axis_max); valid_input_range = (value >= binding->input.axis.axis_min && value <= binding->input.axis.axis_max);
if (valid_input_range) { if (valid_input_range) {
result = (value >= threshold); result |= (value >= threshold);
break;
} }
} else { } else {
valid_input_range = (value >= binding->input.axis.axis_max && value <= binding->input.axis.axis_min); valid_input_range = (value >= binding->input.axis.axis_max && value <= binding->input.axis.axis_min);
if (valid_input_range) { if (valid_input_range) {
result = (value <= threshold); result |= (value <= threshold);
break;
} }
} }
} else if (binding->input_type == SDL_GAMEPAD_BINDTYPE_BUTTON) { } else if (binding->input_type == SDL_GAMEPAD_BINDTYPE_BUTTON) {
result = SDL_GetJoystickButton(gamepad->joystick, binding->input.button); result |= SDL_GetJoystickButton(gamepad->joystick, binding->input.button);
break;
} else if (binding->input_type == SDL_GAMEPAD_BINDTYPE_HAT) { } else if (binding->input_type == SDL_GAMEPAD_BINDTYPE_HAT) {
int hat_mask = SDL_GetJoystickHat(gamepad->joystick, binding->input.hat.hat); int hat_mask = SDL_GetJoystickHat(gamepad->joystick, binding->input.hat.hat);
result = ((hat_mask & binding->input.hat.hat_mask) != 0); result |= ((hat_mask & binding->input.hat.hat_mask) != 0);
break;
} }
} }
} }