diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/InputDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/InputDialogFragment.kt index d07a6e6aea..0e2f78c49f 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/InputDialogFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/InputDialogFragment.kt @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2024 yuzu Emulator Project @@ -169,7 +169,7 @@ class InputDialogFragment : DialogFragment() { NativeInput.onGamePadButtonEvent( controllerData.getGUID(), controllerData.getPort(), - event.keyCode, + InputHandler.getButtonIdFromEvent(event), action ) onInputReceived(event.device) diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InputHandler.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InputHandler.kt index 1909a73319..cde084c68f 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InputHandler.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/InputHandler.kt @@ -49,6 +49,12 @@ object InputHandler { MotionEvent.AXIS_RTRIGGER ) + // Currently, Android doesn't support Joy-Con D-pad buttons. We fall back to the scan code + private const val LINUX_BUTTON_DPAD_UP = 0x220 + private const val LINUX_BUTTON_DPAD_DOWN = 0x221 + private const val LINUX_BUTTON_DPAD_LEFT = 0x222 + private const val LINUX_BUTTON_DPAD_RIGHT = 0x223 + fun isPhysicalGameController(device: InputDevice?): Boolean { device ?: return false @@ -87,12 +93,25 @@ object InputHandler { NativeInput.onGamePadButtonEvent( controllerData.getGUID(), controllerData.getPort(), - event.keyCode, + getButtonIdFromEvent(event), action ) return true } + fun getButtonIdFromEvent(event: KeyEvent): Int { + if (event.keyCode == 0) { + return when (event.scanCode) { + LINUX_BUTTON_DPAD_UP -> KeyEvent.KEYCODE_DPAD_UP + LINUX_BUTTON_DPAD_DOWN -> KeyEvent.KEYCODE_DPAD_DOWN + LINUX_BUTTON_DPAD_LEFT -> KeyEvent.KEYCODE_DPAD_LEFT + LINUX_BUTTON_DPAD_RIGHT -> KeyEvent.KEYCODE_DPAD_RIGHT + else -> return 0 + } + } + return event.keyCode + } + fun dispatchGenericMotionEvent(event: MotionEvent): Boolean { val controllerData = androidControllers[event.device.controllerNumber] ?: return false