iOS gamepad mapping: Better mapping, better defaults. Fixes the start button problem.

controller.controllerPausedHandler should not be set.
This commit is contained in:
Henrik Rydgård 2024-05-26 11:11:45 +02:00
parent 044451d557
commit d46a7ed228
4 changed files with 64 additions and 35 deletions

View File

@ -741,6 +741,8 @@ void RestoreDefault() {
} else { } else {
SetDefaultKeyMap(DEFAULT_MAPPING_ANDROID_PAD, false); SetDefaultKeyMap(DEFAULT_MAPPING_ANDROID_PAD, false);
} }
#elif PPSSPP_PLATFORM(IOS)
SetDefaultKeyMap(DEFAULT_MAPPING_IOS_PAD, false);
#else #else
SetDefaultKeyMap(DEFAULT_MAPPING_KEYBOARD, true); SetDefaultKeyMap(DEFAULT_MAPPING_KEYBOARD, true);
SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false); SetDefaultKeyMap(DEFAULT_MAPPING_PAD, false);

View File

@ -275,6 +275,27 @@ static const DefMappingStruct defaultPadMap[] = {
{VIRTKEY_PAUSE , NKCODE_BUTTON_L2 }, {VIRTKEY_PAUSE , NKCODE_BUTTON_L2 },
}; };
static const DefMappingStruct defaultPadMapIOS[] = {
{CTRL_CROSS , NKCODE_BUTTON_2},
{CTRL_CIRCLE , NKCODE_BUTTON_3},
{CTRL_SQUARE , NKCODE_BUTTON_4},
{CTRL_TRIANGLE , NKCODE_BUTTON_1},
{CTRL_UP , NKCODE_DPAD_UP},
{CTRL_RIGHT , NKCODE_DPAD_RIGHT},
{CTRL_DOWN , NKCODE_DPAD_DOWN},
{CTRL_LEFT , NKCODE_DPAD_LEFT},
{CTRL_START , NKCODE_BUTTON_START},
{CTRL_SELECT , NKCODE_BUTTON_SELECT},
{CTRL_LTRIGGER , NKCODE_BUTTON_L1},
{CTRL_RTRIGGER , NKCODE_BUTTON_R1},
{VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1},
{VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1},
{VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1},
{VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1},
{VIRTKEY_PAUSE , NKCODE_BUTTON_THUMBL },
{VIRTKEY_FASTFORWARD , JOYSTICK_AXIS_RTRIGGER, +1},
};
static const DefMappingStruct defaultOuyaMap[] = { static const DefMappingStruct defaultOuyaMap[] = {
{CTRL_CROSS , NKCODE_BUTTON_A}, {CTRL_CROSS , NKCODE_BUTTON_A},
{CTRL_CIRCLE , NKCODE_BUTTON_B}, {CTRL_CIRCLE , NKCODE_BUTTON_B},
@ -382,6 +403,9 @@ void SetDefaultKeyMap(DefaultMaps dmap, bool replace) {
case DEFAULT_MAPPING_ANDROID_PAD: case DEFAULT_MAPPING_ANDROID_PAD:
SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultPadMapAndroid, ARRAY_SIZE(defaultPadMapAndroid), replace); SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultPadMapAndroid, ARRAY_SIZE(defaultPadMapAndroid), replace);
break; break;
case DEFAULT_MAPPING_IOS_PAD:
SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultPadMapIOS, ARRAY_SIZE(defaultPadMapIOS), replace);
break;
case DEFAULT_MAPPING_OUYA: case DEFAULT_MAPPING_OUYA:
SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultOuyaMap, ARRAY_SIZE(defaultOuyaMap), replace); SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultOuyaMap, ARRAY_SIZE(defaultOuyaMap), replace);
break; break;

View File

@ -6,6 +6,7 @@ enum DefaultMaps {
DEFAULT_MAPPING_KEYBOARD, DEFAULT_MAPPING_KEYBOARD,
DEFAULT_MAPPING_PAD, DEFAULT_MAPPING_PAD,
DEFAULT_MAPPING_ANDROID_PAD, DEFAULT_MAPPING_ANDROID_PAD,
DEFAULT_MAPPING_IOS_PAD,
DEFAULT_MAPPING_XINPUT, DEFAULT_MAPPING_XINPUT,
DEFAULT_MAPPING_ANDROID_XBOX, // XBox controller or similar on Android DEFAULT_MAPPING_ANDROID_XBOX, // XBox controller or similar on Android
DEFAULT_MAPPING_SHIELD, DEFAULT_MAPPING_SHIELD,

View File

@ -15,20 +15,20 @@ static void controllerButtonPressed(BOOL pressed, InputKeyCode keyCode) {
NativeKey(key); NativeKey(key);
} }
static void analogTriggerPressed(InputAxis axis, float value) {
AxisInput axisInput;
axisInput.deviceId = DEVICE_ID_PAD_0;
axisInput.axisId = axis;
axisInput.value = value;
NativeAxis(&axisInput, 1);
}
bool SetupController(GCController *controller) { bool SetupController(GCController *controller) {
GCExtendedGamepad *extendedProfile = controller.extendedGamepad; GCExtendedGamepad *extendedProfile = controller.extendedGamepad;
if (extendedProfile == nil) { if (extendedProfile == nil) {
return false; return false;
} }
controller.controllerPausedHandler = ^(GCController *controller) {
KeyInput key;
key.flags = KEY_DOWN;
key.keyCode = NKCODE_ESCAPE;
key.deviceId = DEVICE_ID_KEYBOARD;
NativeKey(key);
};
extendedProfile.buttonA.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { extendedProfile.buttonA.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
controllerButtonPressed(pressed, NKCODE_BUTTON_2); // Cross controllerButtonPressed(pressed, NKCODE_BUTTON_2); // Cross
}; };
@ -46,11 +46,11 @@ bool SetupController(GCController *controller) {
}; };
extendedProfile.leftShoulder.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { extendedProfile.leftShoulder.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
controllerButtonPressed(pressed, NKCODE_BUTTON_7); // LTrigger controllerButtonPressed(pressed, NKCODE_BUTTON_L1); // LTrigger
}; };
extendedProfile.rightShoulder.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { extendedProfile.rightShoulder.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
controllerButtonPressed(pressed, NKCODE_BUTTON_8); // RTrigger controllerButtonPressed(pressed, NKCODE_BUTTON_R1); // RTrigger
}; };
extendedProfile.dpad.up.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { extendedProfile.dpad.up.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
@ -70,34 +70,36 @@ bool SetupController(GCController *controller) {
}; };
extendedProfile.leftTrigger.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { extendedProfile.leftTrigger.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
controllerButtonPressed(pressed, NKCODE_BUTTON_9); // Select INFO_LOG(SYSTEM, "ltrigger: %f %d", value, (int)pressed);
analogTriggerPressed(JOYSTICK_AXIS_LTRIGGER, value);
}; };
extendedProfile.rightTrigger.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { extendedProfile.rightTrigger.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
controllerButtonPressed(pressed, NKCODE_BUTTON_10); // Start INFO_LOG(SYSTEM, "rtrigger: %f %d", value, (int)pressed);
analogTriggerPressed(JOYSTICK_AXIS_RTRIGGER, value);
}; };
#if defined(__IPHONE_12_1) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_1 #if defined(__IPHONE_12_1) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_12_1
if ([extendedProfile respondsToSelector:@selector(leftThumbstickButton)] && extendedProfile.leftThumbstickButton != nil) { if ([extendedProfile respondsToSelector:@selector(leftThumbstickButton)] && extendedProfile.leftThumbstickButton != nil) {
extendedProfile.leftThumbstickButton.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { extendedProfile.leftThumbstickButton.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
controllerButtonPressed(pressed, NKCODE_BUTTON_11); controllerButtonPressed(pressed, NKCODE_BUTTON_THUMBL);
}; };
} }
if ([extendedProfile respondsToSelector:@selector(rightThumbstickButton)] && extendedProfile.rightThumbstickButton != nil) { if ([extendedProfile respondsToSelector:@selector(rightThumbstickButton)] && extendedProfile.rightThumbstickButton != nil) {
extendedProfile.rightThumbstickButton.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { extendedProfile.rightThumbstickButton.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
controllerButtonPressed(pressed, NKCODE_BUTTON_12); controllerButtonPressed(pressed, NKCODE_BUTTON_THUMBR);
}; };
} }
#endif #endif
#if defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 #if defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
if ([extendedProfile respondsToSelector:@selector(buttonOptions)] && extendedProfile.buttonOptions != nil) { if ([extendedProfile respondsToSelector:@selector(buttonOptions)] && extendedProfile.buttonOptions != nil) {
extendedProfile.buttonOptions.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { extendedProfile.buttonOptions.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
controllerButtonPressed(pressed, NKCODE_BUTTON_13); controllerButtonPressed(pressed, NKCODE_BUTTON_SELECT);
}; };
} }
if ([extendedProfile respondsToSelector:@selector(buttonMenu)] && extendedProfile.buttonMenu != nil) { if ([extendedProfile respondsToSelector:@selector(buttonMenu)] && extendedProfile.buttonMenu != nil) {
extendedProfile.buttonMenu.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) { extendedProfile.buttonMenu.valueChangedHandler = ^(GCControllerButtonInput *button, float value, BOOL pressed) {
controllerButtonPressed(pressed, NKCODE_BUTTON_14); controllerButtonPressed(pressed, NKCODE_BUTTON_START);
}; };
} }
#endif #endif