diff options
Diffstat (limited to 'app/mac/view-controller.mm')
| -rw-r--r-- | app/mac/view-controller.mm | 76 |
1 files changed, 75 insertions, 1 deletions
diff --git a/app/mac/view-controller.mm b/app/mac/view-controller.mm index 8a1fcbd..eb81b6b 100644 --- a/app/mac/view-controller.mm +++ b/app/mac/view-controller.mm @@ -1,5 +1,6 @@ #import "view-controller.hh" #import "controller-adapter-keyboard.hh" +#import "controller-adapter-gamepad.hh" #import "scene.hh" @implementation ViewController @@ -7,6 +8,7 @@ Scene* _scene; NSSize _sceneSize; ControllerAdapterKeyboard* _keyboardController; + NSMutableArray<ControllerAdapterGamepad*>* _gamepadControllers; } - (instancetype)initWithFilePath:(NSString*)filePath @@ -18,11 +20,35 @@ _sceneSize = [_scene size]; _keyboardController = [[ControllerAdapterKeyboard alloc] init]; - [_scene setPrimaryController:_keyboardController]; + _gamepadControllers = [NSMutableArray array]; + for (GCController* controller in [GCController controllers]) + { + auto gamepad = [controller extendedGamepad]; + if (gamepad) + { + auto adapter = [[ControllerAdapterGamepad alloc] initWithProfile:gamepad]; + [_gamepadControllers addObject:adapter]; + } + } + [self updateControllers]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleControllerConnected:) + name:GCControllerDidConnectNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleControllerDisconnected:) + name:GCControllerDidDisconnectNotification + object:nil]; } return self; } +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + - (void)loadView { auto view = [[SKView alloc] init]; @@ -33,6 +59,54 @@ [self setView:view]; } +- (void)updateControllers +{ + // Prefer controllers, then fallback to keyboard input. + if ([_gamepadControllers count] >= 1) + { + [_scene setPrimaryController:[_gamepadControllers objectAtIndex:0]]; + if ([_gamepadControllers count] >= 2) + { + [_scene setSecondaryController:[_gamepadControllers objectAtIndex:1]]; + } + else + { + [_scene setSecondaryController:_keyboardController]; + } + } + else + { + [_scene setPrimaryController:_keyboardController]; + [_scene setSecondaryController:nil]; + } +} + +- (void)handleControllerConnected:(NSNotification*)notification +{ + auto controller = (GCController*)[notification object]; + auto gamepad = [controller extendedGamepad]; + if (gamepad) + { + auto adapter = [[ControllerAdapterGamepad alloc] initWithProfile:gamepad]; + [_gamepadControllers addObject:adapter]; + } + [self updateControllers]; +} + +- (void)handleControllerDisconnected:(NSNotification*)notification +{ + auto controller = (GCController*)[notification object]; + for (auto i = NSUInteger{ [_gamepadControllers count] }; i > 0; --i) + { + auto adapter = [_gamepadControllers objectAtIndex:(i - 1)]; + if ([[adapter profile] controller] == controller) + { + [_gamepadControllers removeObjectAtIndex:(i - 1)]; + } + } + [self updateControllers]; +} + - (NSSize)minimumDisplaySize { return _sceneSize; |
