Skip to content

Commit 0e9ea9f

Browse files
warmenhovenLibretroAdmin
authored andcommitted
tvOS: Fix NSO N64 controller
1 parent 754a194 commit 0e9ea9f

1 file changed

Lines changed: 52 additions & 39 deletions

File tree

ui/drivers/cocoa/cocoa_common.m

Lines changed: 52 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -170,65 +170,78 @@ - (bool)menuIsAtTop
170170
return true;
171171
}
172172

173-
- (bool)didMicroGamepadPress:(UIPressType)type
173+
- (bool)isSiri:(GCController *)controller
174174
{
175-
NSArray<GCController*>* controllers = [GCController controllers];
176-
if ([controllers count] == 1)
177-
return !controllers[0].extendedGamepad;
175+
return (controller.microGamepad && !controller.extendedGamepad && [@"Remote" isEqualToString:controller.vendorName]);
176+
}
178177

178+
- (bool)didMicroGamepadPress:(UIPressType)type
179+
{
179180
/* Are these presses that controllers send? */
180181
if (@available(tvOS 14.3, *))
181182
if (type == UIPressTypePageUp || type == UIPressTypePageDown)
182183
return true;
183184

184-
bool microPress = false;
185-
bool extendedPress = false;
186-
for (GCController *controller in [GCController controllers]) {
187-
if (controller.extendedGamepad)
185+
NSArray<GCController*>* controllers = [GCController controllers];
186+
187+
bool foundSiri = false;
188+
bool nonSiriPress = false;
189+
for (GCController *controller in controllers) {
190+
if ([self isSiri:controller])
191+
{
192+
foundSiri = true;
193+
if (type == UIPressTypeSelect)
194+
return controller.microGamepad.buttonA.pressed;
195+
else if (type == UIPressTypePlayPause)
196+
return controller.microGamepad.buttonX.pressed;
197+
else if (@available(tvOS 13, *)) {
198+
if (type == UIPressTypeMenu)
199+
return controller.microGamepad.buttonMenu.pressed ||
200+
controller.microGamepad.buttonMenu.isPressed;
201+
}
202+
}
203+
else if (controller.extendedGamepad)
188204
{
189205
if (type == UIPressTypeUpArrow)
190-
extendedPress |= controller.extendedGamepad.dpad.up.pressed
191-
|| controller.extendedGamepad.leftThumbstick.up.pressed
192-
|| controller.extendedGamepad.rightThumbstick.up.pressed;
206+
nonSiriPress |= controller.extendedGamepad.dpad.up.pressed
207+
|| controller.extendedGamepad.leftThumbstick.up.pressed
208+
|| controller.extendedGamepad.rightThumbstick.up.pressed;
193209
else if (type == UIPressTypeDownArrow)
194-
extendedPress |= controller.extendedGamepad.dpad.down.pressed
195-
|| controller.extendedGamepad.leftThumbstick.down.pressed
196-
|| controller.extendedGamepad.rightThumbstick.down.pressed;
210+
nonSiriPress |= controller.extendedGamepad.dpad.down.pressed
211+
|| controller.extendedGamepad.leftThumbstick.down.pressed
212+
|| controller.extendedGamepad.rightThumbstick.down.pressed;
197213
else if (type == UIPressTypeLeftArrow)
198-
extendedPress |= controller.extendedGamepad.dpad.left.pressed
199-
|| controller.extendedGamepad.leftShoulder.pressed
200-
|| controller.extendedGamepad.leftTrigger.pressed
201-
|| controller.extendedGamepad.leftThumbstick.left.pressed
202-
|| controller.extendedGamepad.rightThumbstick.left.pressed;
214+
nonSiriPress |= controller.extendedGamepad.dpad.left.pressed
215+
|| controller.extendedGamepad.leftShoulder.pressed
216+
|| controller.extendedGamepad.leftTrigger.pressed
217+
|| controller.extendedGamepad.leftThumbstick.left.pressed
218+
|| controller.extendedGamepad.rightThumbstick.left.pressed;
203219
else if (type == UIPressTypeRightArrow)
204-
extendedPress |= controller.extendedGamepad.dpad.right.pressed
205-
|| controller.extendedGamepad.rightShoulder.pressed
206-
|| controller.extendedGamepad.rightTrigger.pressed
207-
|| controller.extendedGamepad.leftThumbstick.right.pressed
208-
|| controller.extendedGamepad.rightThumbstick.right.pressed;
220+
nonSiriPress |= controller.extendedGamepad.dpad.right.pressed
221+
|| controller.extendedGamepad.rightShoulder.pressed
222+
|| controller.extendedGamepad.rightTrigger.pressed
223+
|| controller.extendedGamepad.leftThumbstick.right.pressed
224+
|| controller.extendedGamepad.rightThumbstick.right.pressed;
209225
else if (type == UIPressTypeSelect)
210-
extendedPress |= controller.extendedGamepad.buttonA.pressed;
226+
nonSiriPress |= controller.extendedGamepad.buttonA.pressed;
211227
else if (type == UIPressTypeMenu)
212-
extendedPress |= controller.extendedGamepad.buttonB.pressed;
228+
nonSiriPress |= controller.extendedGamepad.buttonB.pressed;
213229
else if (type == UIPressTypePlayPause)
214-
extendedPress |= controller.extendedGamepad.buttonX.pressed;
215-
230+
nonSiriPress |= controller.extendedGamepad.buttonX.pressed;
216231
}
217-
else if (controller.microGamepad)
232+
else
218233
{
219-
if (type == UIPressTypeSelect)
220-
microPress |= controller.microGamepad.buttonA.pressed;
221-
else if (type == UIPressTypePlayPause)
222-
microPress |= controller.microGamepad.buttonX.pressed;
223-
else if (@available(tvOS 13, *)) {
224-
if (type == UIPressTypeMenu)
225-
extendedPress |= controller.microGamepad.buttonMenu.pressed ||
226-
controller.microGamepad.buttonMenu.isPressed;
227-
}
234+
/* we have a remote that is not extended. some of these remotes send
235+
* spurious presses. the only way to get them to work properly is to
236+
* make the siri remote work improperly. */
237+
nonSiriPress = true;
228238
}
229239
}
230240

231-
return microPress || !extendedPress;
241+
if (!foundSiri || [controllers count] == 1)
242+
return foundSiri;
243+
244+
return !nonSiriPress;
232245
}
233246

234247
- (void)sendKeyForPress:(UIPressType)type down:(bool)down

0 commit comments

Comments
 (0)