From b1717b6fc275ed83ca54fac6da5fe10c01677938 Mon Sep 17 00:00:00 2001 From: David Griswold Date: Sat, 3 Jan 2026 14:15:49 +0300 Subject: [PATCH] Android: Keep track of the axis direction when mapping axes (also allows inversion for external pads) (#1483) --- .../citra_emu/activities/EmulationActivity.kt | 3 +++ .../settings/model/view/InputBindingSetting.kt | 15 +++++++++++---- src/android/app/src/main/res/values/strings.xml | 4 ++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt index d060c59bb..ca92b308d 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt @@ -342,6 +342,7 @@ class EmulationActivity : AppCompatActivity() { preferences.getInt(InputBindingSetting.getInputAxisButtonKey(axis), -1) val guestOrientation = preferences.getInt(InputBindingSetting.getInputAxisOrientationKey(axis), -1) + val inverted = preferences.getBoolean(InputBindingSetting.getInputAxisInvertedKey(axis),false); if (nextMapping == -1 || guestOrientation == -1) { // Axis is unmapped continue @@ -350,6 +351,8 @@ class EmulationActivity : AppCompatActivity() { // Skip joystick wobble value = 0f } + if (inverted) value = -value; + when (nextMapping) { NativeLibrary.ButtonType.STICK_LEFT -> { axisValuesCirclePad[guestOrientation] = value diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.kt index a2ff73f70..509426537 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.kt @@ -169,6 +169,7 @@ class InputBindingSetting( .remove(oldKey) // Used for button mapping .remove(oldKey + "_GuestOrientation") // Used for axis orientation .remove(oldKey + "_GuestButton") // Used for axis button + .remove(oldKey + "_Inverted") // used for axis inversion .apply() } } @@ -202,7 +203,7 @@ class InputBindingSetting( /** * Helper function to write a gamepad axis mapping for the setting. */ - private fun writeAxisMapping(axis: Int, value: Int) { + private fun writeAxisMapping(axis: Int, value: Int, inverted: Boolean) { // Cleanup old mapping removeOldMapping() @@ -210,6 +211,7 @@ class InputBindingSetting( preferences.edit() .putInt(getInputAxisOrientationKey(axis), if (isHorizontalOrientation()) 0 else 1) .putInt(getInputAxisButtonKey(axis), value) + .putBoolean(getInputAxisInvertedKey(axis),inverted) // Write next reverse mapping for future cleanup .putString(reverseKey, getInputAxisKey(axis)) .apply() @@ -237,7 +239,7 @@ class InputBindingSetting( * * @param device InputDevice from which the input event originated. * @param motionRange MotionRange of the movement - * @param axisDir Either '-' or '+' (currently unused) + * @param axisDir Either '-' or '+' */ fun onMotionInput(device: InputDevice, motionRange: MotionRange, axisDir: Char) { if (!isAxisMappingSupported()) { @@ -253,8 +255,8 @@ class InputBindingSetting( } else { buttonCode } - writeAxisMapping(motionRange.axis, button) - val uiString = "${device.name}: Axis ${motionRange.axis}" + writeAxisMapping(motionRange.axis, button, axisDir == '-') + val uiString = "${device.name}: Axis ${motionRange.axis}" + axisDir value = uiString } @@ -309,6 +311,11 @@ class InputBindingSetting( */ fun getInputAxisButtonKey(axis: Int): String = "${getInputAxisKey(axis)}_GuestButton" + /** + * Helper function to get the settings key for an whether a gamepad axis is inverted. + */ + fun getInputAxisInvertedKey(axis: Int): String = "${getInputAxisKey(axis)}_Inverted" + /** * Helper function to get the settings key for an gamepad axis orientation. */ diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index e861035d5..99c38f608 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -140,8 +140,8 @@ Press or move an input. Input Binding Press or move an input to bind it to %1$s. - Move your joystick up or down. - Move your joystick left or right. + Move your joystick down + Move your joystick right A B SELECT