Skip to content

Commit

Permalink
Send Apple TV remote input as key events unless it's opened as a joys…
Browse files Browse the repository at this point in the history
…tick, to match Android behavior.
  • Loading branch information
slouken committed Feb 7, 2018
1 parent f59b9c8 commit 73c26c2
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 40 deletions.
8 changes: 8 additions & 0 deletions src/joystick/iphoneos/SDL_sysjoystick.m
Expand Up @@ -60,6 +60,7 @@

static int numjoysticks = 0;
static SDL_JoystickID instancecounter = 0;
int SDL_AppleTVRemoteOpenedAsJoystick = 0;

static SDL_JoystickDeviceItem *
GetDeviceForIndex(int device_index)
Expand Down Expand Up @@ -116,6 +117,7 @@
#if TARGET_OS_TV
else if (controller.microGamepad) {
device->guid.data[10] = 3;
device->remote = SDL_TRUE;
}
#endif /* TARGET_OS_TV */

Expand Down Expand Up @@ -455,6 +457,9 @@ SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index)
#endif /* SDL_JOYSTICK_MFI */
}
}
if (device->remote) {
++SDL_AppleTVRemoteOpenedAsJoystick;
}

return 0;
}
Expand Down Expand Up @@ -719,6 +724,9 @@ SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index)
#endif
}
}
if (device->remote) {
--SDL_AppleTVRemoteOpenedAsJoystick;
}
}

/* Function to perform any system-specific joystick related cleanup */
Expand Down
1 change: 1 addition & 0 deletions src/joystick/iphoneos/SDL_sysjoystick_c.h
Expand Up @@ -31,6 +31,7 @@
typedef struct joystick_hwdata
{
SDL_bool accelerometer;
SDL_bool remote;

GCController __unsafe_unretained *controller;
int num_pause_presses;
Expand Down
83 changes: 43 additions & 40 deletions src/video/uikit/SDL_uikitview.m
Expand Up @@ -33,6 +33,9 @@
#import "SDL_uikitmodes.h"
#import "SDL_uikitwindow.h"

/* This is defined in SDL_sysjoystick.m */
extern int SDL_AppleTVRemoteOpenedAsJoystick;

@implementation SDL_uikitview {
SDL_Window *sdlwindow;

Expand All @@ -44,24 +47,22 @@ - (instancetype)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame])) {
#if TARGET_OS_TV
if (!SDL_GetHintBoolean(SDL_HINT_TV_REMOTE_AS_JOYSTICK, SDL_TRUE)) {
/* Apple TV Remote touchpad swipe gestures. */
UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
swipeUp.direction = UISwipeGestureRecognizerDirectionUp;
[self addGestureRecognizer:swipeUp];

UISwipeGestureRecognizer *swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
[self addGestureRecognizer:swipeDown];

UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[self addGestureRecognizer:swipeLeft];

UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
[self addGestureRecognizer:swipeRight];
}
/* Apple TV Remote touchpad swipe gestures. */
UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
swipeUp.direction = UISwipeGestureRecognizerDirectionUp;
[self addGestureRecognizer:swipeUp];

UISwipeGestureRecognizer *swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
[self addGestureRecognizer:swipeDown];

UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[self addGestureRecognizer:swipeLeft];

UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
[self addGestureRecognizer:swipeRight];
#endif

self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Expand Down Expand Up @@ -251,7 +252,7 @@ - (SDL_Scancode)scancodeFromPressType:(UIPressType)presstype

- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event
{
if (!SDL_GetHintBoolean(SDL_HINT_TV_REMOTE_AS_JOYSTICK, SDL_TRUE)) {
if (!SDL_AppleTVRemoteOpenedAsJoystick) {
for (UIPress *press in presses) {
SDL_Scancode scancode = [self scancodeFromPressType:press.type];
SDL_SendKeyboardKey(SDL_PRESSED, scancode);
Expand All @@ -262,7 +263,7 @@ - (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)eve

- (void)pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event
{
if (!SDL_GetHintBoolean(SDL_HINT_TV_REMOTE_AS_JOYSTICK, SDL_TRUE)) {
if (!SDL_AppleTVRemoteOpenedAsJoystick) {
for (UIPress *press in presses) {
SDL_Scancode scancode = [self scancodeFromPressType:press.type];
SDL_SendKeyboardKey(SDL_RELEASED, scancode);
Expand All @@ -273,7 +274,7 @@ - (void)pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)eve

- (void)pressesCancelled:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event
{
if (!SDL_GetHintBoolean(SDL_HINT_TV_REMOTE_AS_JOYSTICK, SDL_TRUE)) {
if (!SDL_AppleTVRemoteOpenedAsJoystick) {
for (UIPress *press in presses) {
SDL_Scancode scancode = [self scancodeFromPressType:press.type];
SDL_SendKeyboardKey(SDL_RELEASED, scancode);
Expand All @@ -294,25 +295,27 @@ -(void)swipeGesture:(UISwipeGestureRecognizer *)gesture
{
/* Swipe gestures don't trigger begin states. */
if (gesture.state == UIGestureRecognizerStateEnded) {
/* Send arrow key presses for now, as we don't have an external API
* which better maps to swipe gestures. */
switch (gesture.direction) {
case UISwipeGestureRecognizerDirectionUp:
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_UP);
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_UP);
break;
case UISwipeGestureRecognizerDirectionDown:
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_DOWN);
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_DOWN);
break;
case UISwipeGestureRecognizerDirectionLeft:
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LEFT);
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LEFT);
break;
case UISwipeGestureRecognizerDirectionRight:
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_RIGHT);
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_RIGHT);
break;
if (!SDL_AppleTVRemoteOpenedAsJoystick) {
/* Send arrow key presses for now, as we don't have an external API
* which better maps to swipe gestures. */
switch (gesture.direction) {
case UISwipeGestureRecognizerDirectionUp:
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_UP);
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_UP);
break;
case UISwipeGestureRecognizerDirectionDown:
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_DOWN);
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_DOWN);
break;
case UISwipeGestureRecognizerDirectionLeft:
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_LEFT);
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LEFT);
break;
case UISwipeGestureRecognizerDirectionRight:
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_RIGHT);
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_RIGHT);
break;
}
}
}
}
Expand Down

0 comments on commit 73c26c2

Please sign in to comment.