From 17956de7e4ff5edfb3f195ee6e2c91212e080ae4 Mon Sep 17 00:00:00 2001 From: Nathaniel Walizer Date: Fri, 17 Jan 2025 00:27:50 -0800 Subject: [PATCH] Add more menu improvements - X button opens/closes menu - Wait for button release before resuming --- src/menu.c | 22 ++++++++++++++++++++-- src/sdl_input.c | 6 ++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/menu.c b/src/menu.c index 48f49a6..6727d18 100644 --- a/src/menu.c +++ b/src/menu.c @@ -33,6 +33,17 @@ static int wait_for_input(nes_Input_Reader* reader, return status; } +static int wait_for_input_quiet(nes_Input_Reader* reader, + nes_input* input) { + int status = 0; + while ( input_Result_Quit != status && + input->controllers[0].buttons) { + time_sleep(US_PER_S / 60); + status = nes_input_update(reader, input); + } + return ( input_Result_Quit == status ? + input_Result_Quit : 0); +} static int count_files(DIR* dir) { int count = 0; @@ -170,7 +181,8 @@ static int run_menu(menu_state* state, const file_list* files, if (input_Result_Quit == special) { status = special; - } else if (buttons & (1 << Button_B)) { + } else if ( input_Result_Menu == special || + (buttons & (1 << Button_B))) { status = input_Result_Cancel; } else if (buttons & ( (1 << Button_A) | @@ -277,10 +289,16 @@ int run_game_menu(menu_state* state, nes_Renderer* rend, int status = run_menu(&menu, &options, 100, rend, input, sys); - if (NULL != state) *state = menu; + if (input_Result_Menu == status) { + status = input_Result_Cancel; + } if (0 == status) status = choices[menu.cursor]; + wait_for_input_quiet(input, &sys->input); + + if (NULL != state) *state = menu; + return status; } diff --git a/src/sdl_input.c b/src/sdl_input.c index d870f8f..0b2bbca 100644 --- a/src/sdl_input.c +++ b/src/sdl_input.c @@ -68,6 +68,7 @@ static const int sdl_keycodes[nes_controller_num_buttons] = { SDLK_RIGHT, }; +static const int sdl_menu_button = SDL_CONTROLLER_BUTTON_X; static const int sdl_save_button = SDL_CONTROLLER_BUTTON_LEFTSHOULDER; static const int sdl_load_button = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER; @@ -142,6 +143,11 @@ static int sdl_input_update(nes_Input_Reader* reader, input->controllers[0].buttons &= ~mask; } + } else if (sdl_menu_button == event.cbutton.button) { + if (SDL_CONTROLLERBUTTONDOWN == event.type) { + status = input_Result_Menu; + } + } else if (sdl_save_button == event.cbutton.button) { if (SDL_CONTROLLERBUTTONDOWN == event.type) { status = input_Result_Save;