summaryrefslogtreecommitdiff
path: root/app/mac/view-controller.mm
diff options
context:
space:
mode:
authorHannes Schulze <haschu0103@outlook.de>2025-01-29 01:14:41 +0100
committerHannes Schulze <haschu0103@outlook.de>2025-01-29 01:14:41 +0100
commit1d32f7561305d6c86b1c80858bc73d55b1c6c402 (patch)
treedb4be090c2403a7e09dcd4eb116c3ec4bf5af926 /app/mac/view-controller.mm
parentc1062208bb54cce8dffa04e9697ae124f271ecaf (diff)
(untested) game controller support
Diffstat (limited to 'app/mac/view-controller.mm')
-rw-r--r--app/mac/view-controller.mm76
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;