From 98328f6014f5ead7b651415da3908b4cc6504730 Mon Sep 17 00:00:00 2001 From: oiupoyt Date: Wed, 30 Sep 2026 07:44:07 +0530 Subject: [PATCH] feat(input): implement Gamepad button translation and Android keycodes --- crates/molotov-core/src/input/gamepad.rs | 73 +++++++++++++++++++ crates/molotov-core/src/input/mod.rs | 1 + .../tests/gamepad_mapping_test.rs | 25 +++++++ 3 files changed, 99 insertions(+) create mode 100644 crates/molotov-core/src/input/gamepad.rs create mode 100644 crates/molotov-core/tests/gamepad_mapping_test.rs diff --git a/crates/molotov-core/src/input/gamepad.rs b/crates/molotov-core/src/input/gamepad.rs new file mode 100644 index 0000000..e0c168c --- /dev/null +++ b/crates/molotov-core/src/input/gamepad.rs @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum GamepadType { + Xbox, + PlayStation, + NintendoSwitch, + Generic, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum GamepadButton { + South, // A (Xbox) / Cross (PS) / B (Switch) + East, // B (Xbox) / Circle (PS) / A (Switch) + West, // X (Xbox) / Square (PS) / Y (Switch) + North, // Y (Xbox) / Triangle (PS) / X (Switch) + Back, + Guide, + Start, + LeftStick, + RightStick, + LeftShoulder, + RightShoulder, + DpadUp, + DpadDown, + DpadLeft, + DpadRight, +} + +#[repr(i32)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum AndroidKeyCode { + DpadUp = 19, + DpadDown = 20, + DpadLeft = 21, + DpadRight = 22, + DpadCenter = 23, + ButtonA = 96, + ButtonB = 97, + ButtonC = 98, + ButtonX = 99, + ButtonY = 100, + ButtonZ = 101, + ButtonL1 = 102, + ButtonR1 = 103, + ButtonL2 = 104, + ButtonR2 = 105, + ButtonThumbL = 106, + ButtonThumbR = 107, + ButtonStart = 108, + ButtonSelect = 109, + ButtonMode = 110, +} + +pub fn translate_button_to_android(btn: GamepadButton, _gamepad_type: GamepadType) -> AndroidKeyCode { + match btn { + GamepadButton::South => AndroidKeyCode::ButtonA, + GamepadButton::East => AndroidKeyCode::ButtonB, + GamepadButton::West => AndroidKeyCode::ButtonX, + GamepadButton::North => AndroidKeyCode::ButtonY, + GamepadButton::Back => AndroidKeyCode::ButtonSelect, + GamepadButton::Guide => AndroidKeyCode::ButtonMode, + GamepadButton::Start => AndroidKeyCode::ButtonStart, + GamepadButton::LeftStick => AndroidKeyCode::ButtonThumbL, + GamepadButton::RightStick => AndroidKeyCode::ButtonThumbR, + GamepadButton::LeftShoulder => AndroidKeyCode::ButtonL1, + GamepadButton::RightShoulder => AndroidKeyCode::ButtonR1, + GamepadButton::DpadUp => AndroidKeyCode::DpadUp, + GamepadButton::DpadDown => AndroidKeyCode::DpadDown, + GamepadButton::DpadLeft => AndroidKeyCode::DpadLeft, + GamepadButton::DpadRight => AndroidKeyCode::DpadRight, + } +} diff --git a/crates/molotov-core/src/input/mod.rs b/crates/molotov-core/src/input/mod.rs index 8534bf3..5034c40 100644 --- a/crates/molotov-core/src/input/mod.rs +++ b/crates/molotov-core/src/input/mod.rs @@ -1,2 +1,3 @@ // SPDX-License-Identifier: GPL-3.0-or-later +pub mod gamepad; pub mod ime; diff --git a/crates/molotov-core/tests/gamepad_mapping_test.rs b/crates/molotov-core/tests/gamepad_mapping_test.rs new file mode 100644 index 0000000..2eb7c8d --- /dev/null +++ b/crates/molotov-core/tests/gamepad_mapping_test.rs @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +use molotov_core::input::gamepad::{ + translate_button_to_android, AndroidKeyCode, GamepadButton, GamepadType, +}; + +#[test] +fn test_xbox_and_playstation_button_mapping() { + // Xbox 'A' button -> Android KEYCODE_BUTTON_A + assert_eq!( + translate_button_to_android(GamepadButton::South, GamepadType::Xbox), + AndroidKeyCode::ButtonA + ); + + // PlayStation 'Cross' button -> Android KEYCODE_BUTTON_A + assert_eq!( + translate_button_to_android(GamepadButton::South, GamepadType::PlayStation), + AndroidKeyCode::ButtonA + ); + + // D-Pad Up -> Android KEYCODE_DPAD_UP + assert_eq!( + translate_button_to_android(GamepadButton::DpadUp, GamepadType::Xbox), + AndroidKeyCode::DpadUp + ); +}