Skip to content

Commit 2433c2b

Browse files
committed
Map hotkeys to gamepad buttons
1 parent 0030897 commit 2433c2b

4 files changed

Lines changed: 111 additions & 1 deletion

File tree

platforms/desktop-shared/application.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ static bool running = true;
4242
static bool paused_when_focus_lost = false;
4343
static Uint64 frame_time_start = 0;
4444
static Uint64 frame_time_end = 0;
45+
static bool input_gamepad_shortcut_prev[config_HotkeyIndex_COUNT] = { };
4546
static Uint32 mouse_last_motion_time = 0;
4647
static const Uint32 mouse_hide_timeout_ms = 1500;
4748

@@ -54,6 +55,8 @@ static void sdl_events_emu(const SDL_Event* event);
5455
static void sdl_shortcuts_gui(const SDL_Event* event);
5556
static void sdl_add_gamepads(void);
5657
static void sdl_remove_gamepad(SDL_JoystickID instance_id);
58+
static void input_check_gamepad_shortcuts(void);
59+
static bool input_get_button(SDL_GameController* controller, int mapping);
5760
static void handle_mouse_cursor(void);
5861
static void handle_menu(void);
5962
static void run_emulator(void);
@@ -631,6 +634,8 @@ static void sdl_events_emu(const SDL_Event* event)
631634
emu_key_released(Left_Key);
632635
else if (event->cbutton.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT)
633636
emu_key_released(Right_Key);
637+
638+
input_check_gamepad_shortcuts();
634639
}
635640
break;
636641

@@ -901,6 +906,60 @@ static void sdl_remove_gamepad(SDL_JoystickID instance_id)
901906
}
902907
}
903908

909+
static void input_check_gamepad_shortcuts(void)
910+
{
911+
SDL_GameController* sdl_controller = application_gamepad;
912+
if (!IsValidPointer(sdl_controller))
913+
return;
914+
915+
for (int i = 0; i < config_HotkeyIndex_COUNT; i++)
916+
{
917+
int button_mapping = config_input_gamepad_shortcuts.gamepad_shortcuts[i];
918+
if (button_mapping == SDL_CONTROLLER_BUTTON_INVALID)
919+
continue;
920+
921+
bool button_pressed = input_get_button(sdl_controller, button_mapping);
922+
923+
if (button_pressed && !input_gamepad_shortcut_prev[i])
924+
{
925+
if (i >= config_HotkeyIndex_SelectSlot1 && i <= config_HotkeyIndex_SelectSlot5)
926+
{
927+
config_emulator.save_slot = i - config_HotkeyIndex_SelectSlot1;
928+
}
929+
else
930+
{
931+
for (int j = 0; j < GUI_HOTKEY_MAP_COUNT; j++)
932+
{
933+
if (gui_hotkey_map[j].config_index == i)
934+
{
935+
gui_shortcut((gui_ShortCutEvent)gui_hotkey_map[j].shortcut);
936+
break;
937+
}
938+
}
939+
}
940+
}
941+
942+
input_gamepad_shortcut_prev[i] = button_pressed;
943+
}
944+
}
945+
946+
static bool input_get_button(SDL_GameController* controller, int mapping)
947+
{
948+
if (!IsValidPointer(controller))
949+
return false;
950+
951+
if (mapping >= GAMEPAD_VBTN_AXIS_BASE)
952+
{
953+
int axis = mapping - GAMEPAD_VBTN_AXIS_BASE;
954+
Sint16 value = SDL_GameControllerGetAxis(controller, (SDL_GameControllerAxis)axis);
955+
return value > GAMEPAD_VBTN_AXIS_THRESHOLD;
956+
}
957+
else
958+
{
959+
return SDL_GameControllerGetButton(controller, (SDL_GameControllerButton)mapping) != 0;
960+
}
961+
}
962+
904963
static void run_emulator(void)
905964
{
906965
config_emulator.paused = emu_is_paused();

platforms/desktop-shared/config.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ void config_init(void)
7474
config_hotkeys[config_HotkeyIndex_SelectSlot4] = make_hotkey(SDL_SCANCODE_4, KMOD_CTRL);
7575
config_hotkeys[config_HotkeyIndex_SelectSlot5] = make_hotkey(SDL_SCANCODE_5, KMOD_CTRL);
7676

77+
for (int i = 0; i < config_HotkeyIndex_COUNT; i++)
78+
{
79+
config_input_gamepad_shortcuts.gamepad_shortcuts[i] = SDL_CONTROLLER_BUTTON_INVALID;
80+
}
81+
7782
config_ini_file = new mINI::INIFile(config_emu_file_path);
7883
}
7984

@@ -195,6 +200,13 @@ void config_read(void)
195200
config_input.gamepad_x_axis = read_int("Input", "GamepadX", SDL_CONTROLLER_AXIS_LEFTX);
196201
config_input.gamepad_y_axis = read_int("Input", "GamepadY", SDL_CONTROLLER_AXIS_LEFTY);
197202

203+
for (int i = 0; i < config_HotkeyIndex_COUNT; i++)
204+
{
205+
char key_name[32];
206+
snprintf(key_name, sizeof(key_name), "Shortcut%d", i);
207+
config_input_gamepad_shortcuts.gamepad_shortcuts[i] = read_int("InputGamepadShortcuts", key_name, SDL_CONTROLLER_BUTTON_INVALID);
208+
}
209+
198210
// Read hotkeys
199211
config_hotkeys[config_HotkeyIndex_OpenROM] = read_hotkey("Hotkeys", "OpenROM", make_hotkey(SDL_SCANCODE_O, KMOD_CTRL));
200212
config_hotkeys[config_HotkeyIndex_Quit] = read_hotkey("Hotkeys", "Quit", make_hotkey(SDL_SCANCODE_Q, KMOD_CTRL));
@@ -319,6 +331,13 @@ void config_write(void)
319331
write_int("Input", "GamepadX", config_input.gamepad_x_axis);
320332
write_int("Input", "GamepadY", config_input.gamepad_y_axis);
321333

334+
for (int i = 0; i < config_HotkeyIndex_COUNT; i++)
335+
{
336+
char key_name[32];
337+
snprintf(key_name, sizeof(key_name), "Shortcut%d", i);
338+
write_int("InputGamepadShortcuts", key_name, config_input_gamepad_shortcuts.gamepad_shortcuts[i]);
339+
}
340+
322341
// Write hotkeys
323342
write_hotkey("Hotkeys", "OpenROM", config_hotkeys[config_HotkeyIndex_OpenROM]);
324343
write_hotkey("Hotkeys", "Quit", config_hotkeys[config_HotkeyIndex_Quit]);

platforms/desktop-shared/config.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ enum config_HotkeyIndex
143143
config_HotkeyIndex_COUNT
144144
};
145145

146+
struct config_Input_Gamepad_Shortcuts
147+
{
148+
int gamepad_shortcuts[config_HotkeyIndex_COUNT];
149+
};
150+
146151
struct config_Hotkey
147152
{
148153
SDL_Scancode key;
@@ -173,6 +178,7 @@ EXTERN config_Emulator config_emulator;
173178
EXTERN config_Video config_video;
174179
EXTERN config_Audio config_audio;
175180
EXTERN config_Input config_input;
181+
EXTERN config_Input_Gamepad_Shortcuts config_input_gamepad_shortcuts;
176182
EXTERN config_Hotkey config_hotkeys[config_HotkeyIndex_COUNT];
177183
EXTERN config_Debug config_debug;
178184

platforms/desktop-shared/gui.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,32 @@ static void main_menu(void)
878878

879879
ImGui::EndMenu();
880880
}
881+
882+
if (ImGui::BeginMenu("Shortcut Configuration"))
883+
{
884+
ImGui::TextDisabled("Gamepad - Shortcuts");
885+
ImGui::Separator();
886+
887+
gamepad_configuration_item("Save State:", &config_input_gamepad_shortcuts.gamepad_shortcuts[config_HotkeyIndex_SaveState]);
888+
gamepad_configuration_item("Load State:", &config_input_gamepad_shortcuts.gamepad_shortcuts[config_HotkeyIndex_LoadState]);
889+
gamepad_configuration_item("Save State Slot 1:", &config_input_gamepad_shortcuts.gamepad_shortcuts[config_HotkeyIndex_SelectSlot1]);
890+
gamepad_configuration_item("Save State Slot 2:", &config_input_gamepad_shortcuts.gamepad_shortcuts[config_HotkeyIndex_SelectSlot2]);
891+
gamepad_configuration_item("Save State Slot 3:", &config_input_gamepad_shortcuts.gamepad_shortcuts[config_HotkeyIndex_SelectSlot3]);
892+
gamepad_configuration_item("Save State Slot 4:", &config_input_gamepad_shortcuts.gamepad_shortcuts[config_HotkeyIndex_SelectSlot4]);
893+
gamepad_configuration_item("Save State Slot 5:", &config_input_gamepad_shortcuts.gamepad_shortcuts[config_HotkeyIndex_SelectSlot5]);
894+
895+
ImGui::Separator();
896+
897+
gamepad_configuration_item("Reset:", &config_input_gamepad_shortcuts.gamepad_shortcuts[config_HotkeyIndex_Reset]);
898+
gamepad_configuration_item("Pause:", &config_input_gamepad_shortcuts.gamepad_shortcuts[config_HotkeyIndex_Pause]);
899+
gamepad_configuration_item("Fast Forward:", &config_input_gamepad_shortcuts.gamepad_shortcuts[config_HotkeyIndex_FFWD]);
900+
gamepad_configuration_item("Screenshot:", &config_input_gamepad_shortcuts.gamepad_shortcuts[config_HotkeyIndex_Screenshot]);
901+
902+
popup_modal_gamepad();
903+
904+
ImGui::EndMenu();
905+
}
906+
881907
ImGui::EndMenu();
882908
}
883909

@@ -1492,7 +1518,7 @@ static void keyboard_configuration_item(const char* text, SDL_Scancode* key)
14921518
static void gamepad_configuration_item(const char* text, int* button)
14931519
{
14941520
ImGui::Text("%s", text);
1495-
ImGui::SameLine(120);
1521+
ImGui::SameLine(130);
14961522

14971523
const char* button_name = "";
14981524

0 commit comments

Comments
 (0)