SDL: Cleanup sfSymbolName support and add them to the dynamic API functions

From e14358265e627a4c0324eaa7317ed13f28d7a138 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sun, 7 Nov 2021 11:16:48 -0800
Subject: [PATCH] Cleanup sfSymbolName support and add them to the dynamic API
 functions

---
 include/SDL_gamecontroller.h            |   9 +-
 src/dynapi/SDL_dynapi_overrides.h       |   2 +
 src/dynapi/SDL_dynapi_procs.h           |   2 +
 src/joystick/iphoneos/SDL_mfijoystick.m | 161 +++++++-----------------
 4 files changed, 58 insertions(+), 116 deletions(-)

diff --git a/include/SDL_gamecontroller.h b/include/SDL_gamecontroller.h
index 9ca41bd1e8..324b113a15 100644
--- a/include/SDL_gamecontroller.h
+++ b/include/SDL_gamecontroller.h
@@ -936,7 +936,11 @@ extern DECLSPEC void SDLCALL SDL_GameControllerClose(SDL_GameController *gamecon
  *
  * \param gamecontroller the controller to query
  * \param button a button on the game controller
+ * \returns the sfSymbolsName or NULL if the name can't be found
  *
+ * \since This function is available since SDL 2.0.18.
+ *
+ * \sa SDL_GameControllerGetAppleSFSymbolsNameForAxis
  */
 extern DECLSPEC const char* SDLCALL SDL_GameControllerGetAppleSFSymbolsNameForButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button);
 
@@ -945,12 +949,15 @@ extern DECLSPEC const char* SDLCALL SDL_GameControllerGetAppleSFSymbolsNameForBu
  *
  * \param gamecontroller the controller to query
  * \param button an axis on the game controller
+ * \returns the sfSymbolsName or NULL if the name can't be found
+ *
+ * \since This function is available since SDL 2.0.18.
  *
+ * \sa SDL_GameControllerGetAppleSFSymbolsNameForButton
  */
 extern DECLSPEC const char* SDLCALL SDL_GameControllerGetAppleSFSymbolsNameForAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis);
 
 
-
 /* Ends C function definitions when using C++ */
 #ifdef __cplusplus
 }
diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h
index 24975f7561..657bfee26a 100644
--- a/src/dynapi/SDL_dynapi_overrides.h
+++ b/src/dynapi/SDL_dynapi_overrides.h
@@ -825,3 +825,5 @@
 #define SDL_GetWindowICCProfile SDL_GetWindowICCProfile_REAL
 #define SDL_GetTicks64 SDL_GetTicks64_REAL
 #define SDL_LinuxSetThreadPriorityAndPolicy SDL_LinuxSetThreadPriorityAndPolicy_REAL
+#define SDL_GameControllerGetAppleSFSymbolsNameForButton SDL_GameControllerGetAppleSFSymbolsNameForButton_REAL
+#define SDL_GameControllerGetAppleSFSymbolsNameForAxis SDL_GameControllerGetAppleSFSymbolsNameForAxis_REAL
diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h
index c7f7f4837f..0ac1669940 100644
--- a/src/dynapi/SDL_dynapi_procs.h
+++ b/src/dynapi/SDL_dynapi_procs.h
@@ -894,3 +894,5 @@ SDL_DYNAPI_PROC(Uint64,SDL_GetTicks64,(void),(),return)
 #ifdef __LINUX__
 SDL_DYNAPI_PROC(int,SDL_LinuxSetThreadPriorityAndPolicy,(Sint64 a, int b, int c),(a,b,c),return)
 #endif
+SDL_DYNAPI_PROC(const char*,SDL_GameControllerGetAppleSFSymbolsNameForButton,(SDL_GameController *a, SDL_GameControllerButton b),(a,b),return)
+SDL_DYNAPI_PROC(const char*,SDL_GameControllerGetAppleSFSymbolsNameForAxis,(SDL_GameController *a, SDL_GameControllerAxis b),(a,b),return)
diff --git a/src/joystick/iphoneos/SDL_mfijoystick.m b/src/joystick/iphoneos/SDL_mfijoystick.m
index 0bfa692093..e657829d69 100644
--- a/src/joystick/iphoneos/SDL_mfijoystick.m
+++ b/src/joystick/iphoneos/SDL_mfijoystick.m
@@ -652,7 +652,7 @@ static int is_macos11(void)
 }
 
 static SDL_JoystickGUID
-IOS_JoystickGetDeviceGUID( int device_index )
+IOS_JoystickGetDeviceGUID(int device_index)
 {
     SDL_JoystickDeviceItem *device = GetDeviceForIndex(device_index);
     SDL_JoystickGUID guid;
@@ -1576,8 +1576,7 @@ SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device)
 
     return nil;
 }
-#endif
-
+#endif /* SDL_JOYSTICK_MFI && ENABLE_PHYSICAL_INPUT_PROFILE */
 
 static char elementName[256];
 
@@ -1585,153 +1584,106 @@ SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device)
 SDL_GameControllerGetAppleSFSymbolsNameForButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button)
 {
     elementName[0] = '\0';
-    if (!gamecontroller) {
-        return elementName;
-    }
-    if (SDL_GameControllerGetJoystick(gamecontroller)->driver != &SDL_IOS_JoystickDriver) {
-        return elementName;
-    }
 #if defined(SDL_JOYSTICK_MFI) && defined(ENABLE_PHYSICAL_INPUT_PROFILE)
-    if (@available(iOS 14.0, tvOS 14.0, macOS 11.0, *)) {
-        GCController *controller = SDL_GameControllerGetJoystick(gamecontroller)->hwdata->controller;
-        if ([controller respondsToSelector:@selector(physicalInputProfile)]) {
-            NSDictionary<NSString *,GCControllerElement *> *elements = controller.physicalInputProfile.elements;
-            switch (button)
-            {
-                case SDL_CONTROLLER_BUTTON_INVALID: {
-                    break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_A: {
+    if (gamecontroller && SDL_GameControllerGetJoystick(gamecontroller)->driver == &SDL_IOS_JoystickDriver) {
+        if (@available(iOS 14.0, tvOS 14.0, macOS 11.0, *)) {
+            GCController *controller = SDL_GameControllerGetJoystick(gamecontroller)->hwdata->controller;
+            if ([controller respondsToSelector:@selector(physicalInputProfile)]) {
+                NSDictionary<NSString *,GCControllerElement *> *elements = controller.physicalInputProfile.elements;
+                switch (button)
+                {
+                case SDL_CONTROLLER_BUTTON_A:
                     GetAppleSFSymbolsNameForElement(elements[GCInputButtonA], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_B: {
+                case SDL_CONTROLLER_BUTTON_B:
                     GetAppleSFSymbolsNameForElement(elements[GCInputButtonB], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_X: {
+                case SDL_CONTROLLER_BUTTON_X:
                     GetAppleSFSymbolsNameForElement(elements[GCInputButtonX], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_Y: {
+                case SDL_CONTROLLER_BUTTON_Y:
                     GetAppleSFSymbolsNameForElement(elements[GCInputButtonY], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_BACK: {
+                case SDL_CONTROLLER_BUTTON_BACK:
                     GetAppleSFSymbolsNameForElement(elements[GCInputButtonOptions], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_GUIDE: {
+                case SDL_CONTROLLER_BUTTON_GUIDE:
                     GetAppleSFSymbolsNameForElement(elements[GCInputButtonHome], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_START: {
+                case SDL_CONTROLLER_BUTTON_START:
                     GetAppleSFSymbolsNameForElement(elements[GCInputButtonMenu], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_LEFTSTICK: {
+                case SDL_CONTROLLER_BUTTON_LEFTSTICK:
                     GetAppleSFSymbolsNameForElement(elements[GCInputLeftThumbstickButton], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_RIGHTSTICK: {
+                case SDL_CONTROLLER_BUTTON_RIGHTSTICK:
                     GetAppleSFSymbolsNameForElement(elements[GCInputRightThumbstickButton], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: {
+                case SDL_CONTROLLER_BUTTON_LEFTSHOULDER:
                     GetAppleSFSymbolsNameForElement(elements[GCInputLeftShoulder], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: {
+                case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER:
                     GetAppleSFSymbolsNameForElement(elements[GCInputRightShoulder], elementName);
                     break;
-                }
-
                 case SDL_CONTROLLER_BUTTON_DPAD_UP: {
                     GCControllerDirectionPad * dpad = GetDirectionalPadForController(controller);
                     if (dpad) {
                         GetAppleSFSymbolsNameForElement(dpad.up, elementName);
                         if (SDL_strlen(elementName) == 0) {
-                            SDL_strlcpy( elementName, "dpad.up.fill", 255 );
+                            SDL_strlcpy(elementName, "dpad.up.fill", sizeof(elementName));
                         }
                     }
                     break;
                 }
-
                 case SDL_CONTROLLER_BUTTON_DPAD_DOWN: {
                     GCControllerDirectionPad * dpad = GetDirectionalPadForController(controller);
                     if (dpad) {
                         GetAppleSFSymbolsNameForElement(dpad.down, elementName);
                         if (SDL_strlen(elementName) == 0) {
-                            SDL_strlcpy( elementName, "dpad.down.fill", 255 );
+                            SDL_strlcpy(elementName, "dpad.down.fill", sizeof(elementName));
                         }
                     }
                     break;
                 }
-
                 case SDL_CONTROLLER_BUTTON_DPAD_LEFT: {
                     GCControllerDirectionPad * dpad = GetDirectionalPadForController(controller);
                     if (dpad) {
                         GetAppleSFSymbolsNameForElement(dpad.left, elementName);
                         if (SDL_strlen(elementName) == 0) {
-                            SDL_strlcpy( elementName, "dpad.left.fill", 255 );
+                            SDL_strlcpy(elementName, "dpad.left.fill", sizeof(elementName));
                         }
                     }
                     break;
                 }
-
                 case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: {
                     GCControllerDirectionPad * dpad = GetDirectionalPadForController(controller);
                     if (dpad) {
                         GetAppleSFSymbolsNameForElement(dpad.right, elementName);
                         if (SDL_strlen(elementName) == 0) {
-                            SDL_strlcpy( elementName, "dpad.right.fill", 255 );
+                            SDL_strlcpy(elementName, "dpad.right.fill", sizeof(elementName));
                         }
                     }
                     break;
                 }
-
-                case SDL_CONTROLLER_BUTTON_MISC1: {
+                case SDL_CONTROLLER_BUTTON_MISC1:
                     GetAppleSFSymbolsNameForElement(elements[GCInputDualShockTouchpadButton], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_PADDLE1: {
+                case SDL_CONTROLLER_BUTTON_PADDLE1:
                     GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleOne], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_PADDLE2: {
+                case SDL_CONTROLLER_BUTTON_PADDLE2:
                     GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleTwo], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_PADDLE3: {
+                case SDL_CONTROLLER_BUTTON_PADDLE3:
                     GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleThree], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_PADDLE4: {
+                case SDL_CONTROLLER_BUTTON_PADDLE4:
                     GetAppleSFSymbolsNameForElement(elements[GCInputXboxPaddleFour], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_TOUCHPAD: {
+                case SDL_CONTROLLER_BUTTON_TOUCHPAD:
                     GetAppleSFSymbolsNameForElement(elements[GCInputDualShockTouchpadButton], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_BUTTON_MAX: {
+                default:
                     break;
                 }
             }
@@ -1746,61 +1698,40 @@ SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device)
 SDL_GameControllerGetAppleSFSymbolsNameForAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis)
 {
     elementName[0] = '\0';
-    if (!gamecontroller) {
-        return elementName;
-    }
-    if (SDL_GameControllerGetJoystick(gamecontroller)->driver != &SDL_IOS_JoystickDriver) {
-        return elementName;
-    }
 #if defined(SDL_JOYSTICK_MFI) && defined(ENABLE_PHYSICAL_INPUT_PROFILE)
-    if (@available(iOS 14.0, tvOS 14.0, macOS 11.0, *)) {
-        GCController *controller = SDL_GameControllerGetJoystick(gamecontroller)->hwdata->controller;
-        if ([controller respondsToSelector:@selector(physicalInputProfile)]) {
-            NSDictionary<NSString *,GCControllerElement *> *elements = controller.physicalInputProfile.elements;
-            switch (axis)
-            {
-
-                case SDL_CONTROLLER_AXIS_INVALID:
-                    break;
-
-                case SDL_CONTROLLER_AXIS_LEFTX:{
+    if (gamecontroller && SDL_GameControllerGetJoystick(gamecontroller)->driver == &SDL_IOS_JoystickDriver) {
+        if (@available(iOS 14.0, tvOS 14.0, macOS 11.0, *)) {
+            GCController *controller = SDL_GameControllerGetJoystick(gamecontroller)->hwdata->controller;
+            if ([controller respondsToSelector:@selector(physicalInputProfile)]) {
+                NSDictionary<NSString *,GCControllerElement *> *elements = controller.physicalInputProfile.elements;
+                switch (axis)
+                {
+                case SDL_CONTROLLER_AXIS_LEFTX:
                     GetAppleSFSymbolsNameForElement(elements[GCInputLeftThumbstick], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_AXIS_LEFTY: {
+                case SDL_CONTROLLER_AXIS_LEFTY:
                     GetAppleSFSymbolsNameForElement(elements[GCInputLeftThumbstick], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_AXIS_RIGHTX: {
+                case SDL_CONTROLLER_AXIS_RIGHTX:
                     GetAppleSFSymbolsNameForElement(elements[GCInputRightThumbstick], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_AXIS_RIGHTY: {
+                case SDL_CONTROLLER_AXIS_RIGHTY:
                     GetAppleSFSymbolsNameForElement(elements[GCInputRightThumbstick], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_AXIS_TRIGGERLEFT: {
+                case SDL_CONTROLLER_AXIS_TRIGGERLEFT:
                     GetAppleSFSymbolsNameForElement(elements[GCInputLeftTrigger], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_AXIS_TRIGGERRIGHT: {
+                case SDL_CONTROLLER_AXIS_TRIGGERRIGHT:
                     GetAppleSFSymbolsNameForElement(elements[GCInputRightTrigger], elementName);
                     break;
-                }
-
-                case SDL_CONTROLLER_AXIS_MAX: {
+                default:
                     break;
                 }
             }
         }
     }
 #endif
-    return elementName;
+    return *elementName ? elementName : NULL;
 }