Commit 0bdf4f95bfc51de21ff6444ee1e1fdb7f6ad2661

Sam Lantinga 2021-03-22T19:19:01

Disable system gestures on MFi controllers while they're open, so we get access to the back button, etc.

diff --git a/src/joystick/iphoneos/SDL_mfijoystick.m b/src/joystick/iphoneos/SDL_mfijoystick.m
index 0930f62..dd70f5c 100644
--- a/src/joystick/iphoneos/SDL_mfijoystick.m
+++ b/src/joystick/iphoneos/SDL_mfijoystick.m
@@ -89,6 +89,7 @@ static id disconnectObserver = nil;
 #define ENABLE_MFI_RUMBLE
 #define ENABLE_MFI_LIGHT
 #define ENABLE_MFI_SENSORS
+#define ENABLE_MFI_SYSTEM_GESTURE_STATE
 #define ENABLE_PHYSICAL_INPUT_PROFILE
 #endif
 
@@ -656,6 +657,18 @@ IOS_JoystickOpen(SDL_Joystick *joystick, int device_index)
             }
 #endif /* ENABLE_MFI_SENSORS */
 
+#ifdef ENABLE_MFI_SYSTEM_GESTURE_STATE
+            if (@available(macOS 11.0, iOS 14.0, tvOS 14.0, *)) {
+                GCController *controller = joystick->hwdata->controller;
+				if (controller.extendedGamepad) {
+					GCExtendedGamepad *gamepad = controller.extendedGamepad;
+					if ([gamepad.buttonOptions isBoundToSystemGesture]) {
+						gamepad.buttonOptions.preferredSystemGestureState = GCSystemGestureStateDisabled;
+					}
+				}
+            }
+#endif /* ENABLE_MFI_SYSTEM_GESTURE_STATE */
+
 #endif /* SDL_JOYSTICK_MFI */
         }
     }
@@ -1331,7 +1344,18 @@ IOS_JoystickClose(SDL_Joystick *joystick)
             GCController *controller = device->controller;
             controller.controllerPausedHandler = nil;
             controller.playerIndex = -1;
-#endif
+
+#ifdef ENABLE_MFI_SYSTEM_GESTURE_STATE
+            if (@available(macOS 11.0, iOS 14.0, tvOS 14.0, *)) {
+                GCController *controller = joystick->hwdata->controller;
+				if (controller.extendedGamepad) {
+					GCExtendedGamepad *gamepad = controller.extendedGamepad;
+					gamepad.buttonOptions.preferredSystemGestureState = GCSystemGestureStateEnabled;
+                }
+            }
+#endif /* ENABLE_MFI_SYSTEM_GESTURE_STATE */
+
+#endif /* SDL_JOYSTICK_MFI */
         }
     }
     if (device->remote) {