From 58882425fcb3c03b968a01355a6d560558870ece Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Wed, 19 Jul 2023 09:48:32 -0700
Subject: [PATCH] Use the lower index axis if the controller generates two axes
for a single element
The Flydigi Apex and Vader controllers fire both axis 4 and 5 for the right thumbstick Y axis, for example.
---
test/testcontroller.c | 55 +++++++++++++++++++++++++++++++++++++++----
1 file changed, 51 insertions(+), 4 deletions(-)
diff --git a/test/testcontroller.c b/test/testcontroller.c
index 7f831946cbc4..d8d74d9683f3 100644
--- a/test/testcontroller.c
+++ b/test/testcontroller.c
@@ -385,6 +385,36 @@ static void StopBinding(void)
SetCurrentBindingElement(SDL_GAMEPAD_ELEMENT_INVALID, SDL_FALSE);
}
+typedef struct
+{
+ int axis;
+ int direction;
+} AxisInfo;
+
+static SDL_bool ParseAxisInfo(const char *description, AxisInfo *info)
+{
+ if (!description) {
+ return SDL_FALSE;
+ }
+
+ if (*description == '-') {
+ info->direction = -1;
+ ++description;
+ } else if (*description == '+') {
+ info->direction = 1;
+ ++description;
+ } else {
+ info->direction = 0;
+ }
+
+ if (description[0] == 'a' && SDL_isdigit(description[1])) {
+ ++description;
+ info->axis = SDL_atoi(description);
+ return SDL_TRUE;
+ }
+ return SDL_FALSE;
+}
+
static void CommitBindingElement(const char *binding, SDL_bool force)
{
char *mapping;
@@ -420,9 +450,17 @@ static void CommitBindingElement(const char *binding, SDL_bool force)
if (current_button && !proposed_button) {
ignore_binding = SDL_TRUE;
}
+ /* Use the lower index button (we map from lower to higher button index) */
+ if (current_button && proposed_button && current[1] < binding[1]) {
+ ignore_binding = SDL_TRUE;
+ }
}
if (native_axis) {
- SDL_bool current_axis = (current && (*current == '-' || *current == '+' || *current == 'a'));
+ AxisInfo current_axis_info;
+ AxisInfo proposed_axis_info;
+ SDL_bool current_axis = ParseAxisInfo(current, ¤t_axis_info);
+ SDL_bool proposed_axis = ParseAxisInfo(binding, &proposed_axis_info);
+
if (current_axis) {
/* Ignore this unless the proposed binding extends the existing axis */
ignore_binding = SDL_TRUE;
@@ -436,12 +474,21 @@ static void CommitBindingElement(const char *binding, SDL_bool force)
++binding;
ignore_binding = SDL_FALSE;
}
+
+ /* Use the lower index axis (we map from lower to higher axis index) */
+ if (proposed_axis && proposed_axis_info.axis < current_axis_info.axis) {
+ ignore_binding = SDL_FALSE;
+ }
}
}
if (native_dpad) {
- SDL_bool current_dpad = (current && *current == 'h');
- SDL_bool proposed_dpad = (binding && *binding == 'h');
- if (current_dpad && !proposed_dpad) {
+ SDL_bool current_hat = (current && *current == 'h');
+ SDL_bool proposed_hat = (binding && *binding == 'h');
+ if (current_hat && !proposed_hat) {
+ ignore_binding = SDL_TRUE;
+ }
+ /* Use the lower index hat (we map from lower to higher hat index) */
+ if (current_hat && proposed_hat && current[1] < binding[1]) {
ignore_binding = SDL_TRUE;
}
}