Fixed building with an older SDK and macOS target

Sam Lantinga 2020-11-23 20:57:14 -08:00
parent 268aa45645
commit 62e39b5fa7
3 changed files with 41 additions and 24 deletions

View File

@ -147,6 +147,15 @@
#define SDL_JOYSTICK_MFI 1 #define SDL_JOYSTICK_MFI 1
#define SDL_HAPTIC_IOKIT 1 #define SDL_HAPTIC_IOKIT 1
/* The MFI controller support requires ARC Objective C runtime */
#if TARGET_OS_OSX
# if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_8
# undef SDL_JOYSTICK_MFI
# elif defined(__i386__) && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_12
# undef SDL_JOYSTICK_MFI
# endif
#endif
/* Enable the dummy sensor driver */ /* Enable the dummy sensor driver */
#define SDL_SENSOR_DUMMY 1 #define SDL_SENSOR_DUMMY 1

View File

@ -69,7 +69,7 @@ static SDL_JoystickDriver *SDL_joystick_drivers[] = {
#ifdef SDL_JOYSTICK_IOKIT #ifdef SDL_JOYSTICK_IOKIT
&SDL_DARWIN_JoystickDriver, &SDL_DARWIN_JoystickDriver,
#endif #endif
#if (defined(__IPHONEOS__) || defined(__TVOS__)) && !defined(SDL_JOYSTICK_DISABLED) #if (defined(__MACOSX__) || defined(__IPHONEOS__) || defined(__TVOS__)) && !defined(SDL_JOYSTICK_DISABLED)
&SDL_IOS_JoystickDriver, &SDL_IOS_JoystickDriver,
#endif #endif
#ifdef SDL_JOYSTICK_ANDROID #ifdef SDL_JOYSTICK_ANDROID

View File

@ -42,7 +42,8 @@
#include "../../events/SDL_events_c.h" #include "../../events/SDL_events_c.h"
#endif #endif
#if !TARGET_OS_TV #if !TARGET_OS_TV && !TARGET_OS_OSX
#define SDL_JOYSTICK_iOS_ACCELEROMETER
#import <CoreMotion/CoreMotion.h> #import <CoreMotion/CoreMotion.h>
#endif #endif
@ -100,10 +101,10 @@ static id disconnectObserver = nil;
#endif /* SDL_JOYSTICK_MFI */ #endif /* SDL_JOYSTICK_MFI */
#if !TARGET_OS_TV && !TARGET_OS_OSX #ifdef SDL_JOYSTICK_iOS_ACCELEROMETER
static const char *accelerometerName = "iOS Accelerometer"; static const char *accelerometerName = "iOS Accelerometer";
static CMMotionManager *motionManager = nil; static CMMotionManager *motionManager = nil;
#endif /* !TARGET_OS_TV */ #endif /* SDL_JOYSTICK_iOS_ACCELEROMETER */
static SDL_JoystickDeviceItem *deviceList = NULL; static SDL_JoystickDeviceItem *deviceList = NULL;
@ -127,10 +128,10 @@ GetDeviceForIndex(int device_index)
return device; return device;
} }
#ifdef SDL_JOYSTICK_MFI
static void static void
IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCController *controller) IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCController *controller)
{ {
#ifdef SDL_JOYSTICK_MFI
Uint16 *guid16 = (Uint16 *)device->guid.data; Uint16 *guid16 = (Uint16 *)device->guid.data;
Uint16 vendor = 0; Uint16 vendor = 0;
Uint16 product = 0; Uint16 product = 0;
@ -328,10 +329,10 @@ IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCController *controlle
/* This will be set when the first button press of the controller is /* This will be set when the first button press of the controller is
* detected. */ * detected. */
controller.playerIndex = -1; controller.playerIndex = -1;
#endif /* SDL_JOYSTICK_MFI */
} }
#endif /* SDL_JOYSTICK_MFI */
#if defined(SDL_JOYSTICK_iOS_ACCELEROMETER) || defined(SDL_JOYSTICK_MFI)
static void static void
IOS_AddJoystickDevice(GCController *controller, SDL_bool accelerometer) IOS_AddJoystickDevice(GCController *controller, SDL_bool accelerometer)
{ {
@ -362,10 +363,7 @@ IOS_AddJoystickDevice(GCController *controller, SDL_bool accelerometer)
device->instance_id = SDL_GetNextJoystickInstanceID(); device->instance_id = SDL_GetNextJoystickInstanceID();
if (accelerometer) { if (accelerometer) {
#if TARGET_OS_TV || TARGET_OS_OSX #ifdef SDL_JOYSTICK_iOS_ACCELEROMETER
SDL_free(device);
return;
#else
device->name = SDL_strdup(accelerometerName); device->name = SDL_strdup(accelerometerName);
device->naxes = 3; /* Device acceleration in the x, y, and z axes. */ device->naxes = 3; /* Device acceleration in the x, y, and z axes. */
device->nhats = 0; device->nhats = 0;
@ -373,9 +371,17 @@ IOS_AddJoystickDevice(GCController *controller, SDL_bool accelerometer)
/* Use the accelerometer name as a GUID. */ /* Use the accelerometer name as a GUID. */
SDL_memcpy(&device->guid.data, device->name, SDL_min(sizeof(SDL_JoystickGUID), SDL_strlen(device->name))); SDL_memcpy(&device->guid.data, device->name, SDL_min(sizeof(SDL_JoystickGUID), SDL_strlen(device->name)));
#endif /* TARGET_OS_TV */ #else
SDL_free(device);
return;
#endif /* SDL_JOYSTICK_iOS_ACCELEROMETER */
} else if (controller) { } else if (controller) {
#ifdef SDL_JOYSTICK_MFI
IOS_AddMFIJoystickDevice(device, controller); IOS_AddMFIJoystickDevice(device, controller);
#else
SDL_free(device);
return;
#endif /* SDL_JOYSTICK_MFI */
} }
if (deviceList == NULL) { if (deviceList == NULL) {
@ -392,6 +398,7 @@ IOS_AddJoystickDevice(GCController *controller, SDL_bool accelerometer)
SDL_PrivateJoystickAdded(device->instance_id); SDL_PrivateJoystickAdded(device->instance_id);
} }
#endif /* SDL_JOYSTICK_iOS_ACCELEROMETER || SDL_JOYSTICK_MFI */
static SDL_JoystickDeviceItem * static SDL_JoystickDeviceItem *
IOS_RemoveJoystickDevice(SDL_JoystickDeviceItem *device) IOS_RemoveJoystickDevice(SDL_JoystickDeviceItem *device)
@ -467,12 +474,12 @@ static int
IOS_JoystickInit(void) IOS_JoystickInit(void)
{ {
if (@available(macos 11.0, *)) @autoreleasepool { if (@available(macos 11.0, *)) @autoreleasepool {
#if !TARGET_OS_TV && !TARGET_OS_OSX #ifdef SDL_JOYSTICK_iOS_ACCELEROMETER
if (SDL_GetHintBoolean(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, SDL_TRUE)) { if (SDL_GetHintBoolean(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, SDL_TRUE)) {
/* Default behavior, accelerometer as joystick */ /* Default behavior, accelerometer as joystick */
IOS_AddJoystickDevice(nil, SDL_TRUE); IOS_AddJoystickDevice(nil, SDL_TRUE);
} }
#endif /* !TARGET_OS_TV */ #endif
#ifdef SDL_JOYSTICK_MFI #ifdef SDL_JOYSTICK_MFI
/* GameController.framework was added in iOS 7. */ /* GameController.framework was added in iOS 7. */
@ -606,7 +613,7 @@ IOS_JoystickOpen(SDL_Joystick *joystick, int device_index)
@autoreleasepool { @autoreleasepool {
if (device->accelerometer) { if (device->accelerometer) {
#if !TARGET_OS_TV && !TARGET_OS_OSX #ifdef SDL_JOYSTICK_iOS_ACCELEROMETER
if (motionManager == nil) { if (motionManager == nil) {
motionManager = [[CMMotionManager alloc] init]; motionManager = [[CMMotionManager alloc] init];
} }
@ -614,7 +621,7 @@ IOS_JoystickOpen(SDL_Joystick *joystick, int device_index)
/* Shorter times between updates can significantly increase CPU usage. */ /* Shorter times between updates can significantly increase CPU usage. */
motionManager.accelerometerUpdateInterval = 0.1; motionManager.accelerometerUpdateInterval = 0.1;
[motionManager startAccelerometerUpdates]; [motionManager startAccelerometerUpdates];
#endif /* !TARGET_OS_TV */ #endif
} else { } else {
#ifdef SDL_JOYSTICK_MFI #ifdef SDL_JOYSTICK_MFI
if (device->uses_pause_handler) { if (device->uses_pause_handler) {
@ -652,7 +659,7 @@ IOS_JoystickOpen(SDL_Joystick *joystick, int device_index)
static void static void
IOS_AccelerometerUpdate(SDL_Joystick *joystick) IOS_AccelerometerUpdate(SDL_Joystick *joystick)
{ {
#if !TARGET_OS_TV && !TARGET_OS_OSX #ifdef SDL_JOYSTICK_iOS_ACCELEROMETER
const float maxgforce = SDL_IPHONE_MAX_GFORCE; const float maxgforce = SDL_IPHONE_MAX_GFORCE;
const SInt16 maxsint16 = 0x7FFF; const SInt16 maxsint16 = 0x7FFF;
CMAcceleration accel; CMAcceleration accel;
@ -690,7 +697,7 @@ IOS_AccelerometerUpdate(SDL_Joystick *joystick)
SDL_PrivateJoystickAxis(joystick, 0, (accel.x / maxgforce) * maxsint16); SDL_PrivateJoystickAxis(joystick, 0, (accel.x / maxgforce) * maxsint16);
SDL_PrivateJoystickAxis(joystick, 1, -(accel.y / maxgforce) * maxsint16); SDL_PrivateJoystickAxis(joystick, 1, -(accel.y / maxgforce) * maxsint16);
SDL_PrivateJoystickAxis(joystick, 2, (accel.z / maxgforce) * maxsint16); SDL_PrivateJoystickAxis(joystick, 2, (accel.z / maxgforce) * maxsint16);
#endif /* !TARGET_OS_TV */ #endif /* SDL_JOYSTICK_iOS_ACCELEROMETER */
} }
#ifdef SDL_JOYSTICK_MFI #ifdef SDL_JOYSTICK_MFI
@ -1306,9 +1313,9 @@ IOS_JoystickClose(SDL_Joystick *joystick)
#endif /* ENABLE_MFI_RUMBLE */ #endif /* ENABLE_MFI_RUMBLE */
if (device->accelerometer) { if (device->accelerometer) {
#if !TARGET_OS_TV && !TARGET_OS_OSX #ifdef SDL_JOYSTICK_iOS_ACCELEROMETER
[motionManager stopAccelerometerUpdates]; [motionManager stopAccelerometerUpdates];
#endif /* !TARGET_OS_TV */ #endif
} else if (device->controller) { } else if (device->controller) {
#ifdef SDL_JOYSTICK_MFI #ifdef SDL_JOYSTICK_MFI
GCController *controller = device->controller; GCController *controller = device->controller;
@ -1349,9 +1356,9 @@ IOS_JoystickQuit(void)
IOS_RemoveJoystickDevice(deviceList); IOS_RemoveJoystickDevice(deviceList);
} }
#if !TARGET_OS_TV && !TARGET_OS_OSX #ifdef SDL_JOYSTICK_iOS_ACCELEROMETER
motionManager = nil; motionManager = nil;
#endif /* !TARGET_OS_TV */ #endif
} }
numjoysticks = 0; numjoysticks = 0;
@ -1367,11 +1374,12 @@ IOS_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping *out)
extern SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device); extern SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device);
SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device) SDL_bool IOS_SupportedHIDDevice(IOHIDDeviceRef device)
{ {
#ifdef SDL_JOYSTICK_MFI
if (@available(macOS 11.0, *)) { if (@available(macOS 11.0, *)) {
return [GCController supportsHIDDevice:device] ? SDL_TRUE : SDL_FALSE; return [GCController supportsHIDDevice:device] ? SDL_TRUE : SDL_FALSE;
} else {
return SDL_FALSE;
} }
#endif
return SDL_FALSE;
} }
#endif #endif