mirror of https://github.com/libsdl-org/SDL
Added a new hint SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION.
When set to "1", the orientation of the Apple TV remote affects the axes of the corresponding SDL joystick. It is "0" (disabled) by default.
This commit is contained in:
parent
4bcce330d1
commit
a96b6f2104
|
@ -295,6 +295,16 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
#define SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS "SDL_APPLE_TV_CONTROLLER_UI_EVENTS"
|
#define SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS "SDL_APPLE_TV_CONTROLLER_UI_EVENTS"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief A variable controlling whether the Apple TV remote's joystick axes
|
||||||
|
* will automatically match the rotation of the remote.
|
||||||
|
*
|
||||||
|
* This variable can be set to the following values:
|
||||||
|
* "0" - Remote orientation does not affect joystick axes (the default).
|
||||||
|
* "1" - Joystick axes are based on the orientation of the remote.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION "SDL_APPLE_TV_REMOTE_ALLOW_ROTATION"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief A variable controlling whether the Android / iOS built-in
|
* \brief A variable controlling whether the Android / iOS built-in
|
||||||
* accelerometer should be listed as a joystick device, rather than listing
|
* accelerometer should be listed as a joystick device, rather than listing
|
||||||
|
|
|
@ -127,9 +127,13 @@ SDL_SYS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCController *contr
|
||||||
}
|
}
|
||||||
#if TARGET_OS_TV
|
#if TARGET_OS_TV
|
||||||
else if (controller.microGamepad) {
|
else if (controller.microGamepad) {
|
||||||
|
const char *hint = SDL_GetHint(SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION);
|
||||||
|
|
||||||
device->naxes = 2; /* treat the touch surface as two axes */
|
device->naxes = 2; /* treat the touch surface as two axes */
|
||||||
device->nhats = 0; /* apparently the touch surface-as-dpad is buggy */
|
device->nhats = 0; /* apparently the touch surface-as-dpad is buggy */
|
||||||
device->nbuttons = 3; /* AX, pause button */
|
device->nbuttons = 3; /* AX, pause button */
|
||||||
|
|
||||||
|
controller.microGamepad.allowsRotation = (hint != NULL && *hint != '0');
|
||||||
}
|
}
|
||||||
#endif /* TARGET_OS_TV */
|
#endif /* TARGET_OS_TV */
|
||||||
|
|
||||||
|
@ -248,6 +252,22 @@ SDL_SYS_RemoveJoystickDevice(SDL_JoystickDeviceItem *device)
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_OS_TV
|
||||||
|
static void
|
||||||
|
SDL_AppleTVRemoteRotationHintChanged(void *udata, const char *name, const char *oldValue, const char *newValue)
|
||||||
|
{
|
||||||
|
BOOL allowRotation = newValue != NULL && *newValue != '0';
|
||||||
|
|
||||||
|
@autoreleasepool {
|
||||||
|
for (GCController *controller in [GCController controllers]) {
|
||||||
|
if (controller.microGamepad) {
|
||||||
|
controller.microGamepad.allowsRotation = allowRotation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* TARGET_OS_TV */
|
||||||
|
|
||||||
/* Function to scan the system for joysticks.
|
/* Function to scan the system for joysticks.
|
||||||
* Joystick 0 should be the system default joystick.
|
* Joystick 0 should be the system default joystick.
|
||||||
* It should return 0, or -1 on an unrecoverable fatal error.
|
* It should return 0, or -1 on an unrecoverable fatal error.
|
||||||
|
@ -276,6 +296,11 @@ SDL_SYS_JoystickInit(void)
|
||||||
SDL_SYS_AddJoystickDevice(controller, SDL_FALSE);
|
SDL_SYS_AddJoystickDevice(controller, SDL_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_OS_TV
|
||||||
|
SDL_AddHintCallback(SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION,
|
||||||
|
SDL_AppleTVRemoteRotationHintChanged, NULL);
|
||||||
|
#endif /* TARGET_OS_TV */
|
||||||
|
|
||||||
connectObserver = [center addObserverForName:GCControllerDidConnectNotification
|
connectObserver = [center addObserverForName:GCControllerDidConnectNotification
|
||||||
object:nil
|
object:nil
|
||||||
queue:nil
|
queue:nil
|
||||||
|
@ -656,6 +681,11 @@ SDL_SYS_JoystickQuit(void)
|
||||||
[center removeObserver:disconnectObserver name:GCControllerDidDisconnectNotification object:nil];
|
[center removeObserver:disconnectObserver name:GCControllerDidDisconnectNotification object:nil];
|
||||||
disconnectObserver = nil;
|
disconnectObserver = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TARGET_OS_TV
|
||||||
|
SDL_DelHintCallback(SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION,
|
||||||
|
SDL_AppleTVRemoteRotationHintChanged, NULL);
|
||||||
|
#endif /* TARGET_OS_TV */
|
||||||
#endif /* SDL_JOYSTICK_MFI */
|
#endif /* SDL_JOYSTICK_MFI */
|
||||||
|
|
||||||
while (deviceList != NULL) {
|
while (deviceList != NULL) {
|
||||||
|
|
Loading…
Reference in New Issue