From 4f2de6d578f4d249741f1f004053c689f173f111 Mon Sep 17 00:00:00 2001 From: Themaister Date: Sun, 29 Sep 2013 20:40:04 +0200 Subject: [PATCH] Add RGUI menu toggle config. --- frontend/menu/menu_common.h | 15 ++++++- frontend/menu/rgui.c | 78 ++++++++++++++++----------------- frontend/menu/rguidisp_bitmap.c | 18 +++++++- input/input_common.c | 71 ++++++++++++++++++++++++++++++ input/input_common.h | 1 + 5 files changed, 139 insertions(+), 44 deletions(-) diff --git a/frontend/menu/menu_common.h b/frontend/menu/menu_common.h index 70789f7df2..98418cec95 100644 --- a/frontend/menu/menu_common.h +++ b/frontend/menu/menu_common.h @@ -149,7 +149,8 @@ typedef enum RGUI_SETTINGS_BIND_DPAD_EMULATION, // Match up with libretro order for simplicity. - RGUI_SETTINGS_BIND_B, + RGUI_SETTINGS_BIND_BEGIN, + RGUI_SETTINGS_BIND_B = RGUI_SETTINGS_BIND_BEGIN, RGUI_SETTINGS_BIND_Y, RGUI_SETTINGS_BIND_SELECT, RGUI_SETTINGS_BIND_START, @@ -165,8 +166,19 @@ typedef enum RGUI_SETTINGS_BIND_R2, RGUI_SETTINGS_BIND_L3, RGUI_SETTINGS_BIND_R3, + RGUI_SETTINGS_BIND_ANALOG_LEFT_X_PLUS, + RGUI_SETTINGS_BIND_ANALOG_LEFT_X_MINUS, + RGUI_SETTINGS_BIND_ANALOG_LEFT_Y_PLUS, + RGUI_SETTINGS_BIND_ANALOG_LEFT_Y_MINUS, + RGUI_SETTINGS_BIND_ANALOG_RIGHT_X_PLUS, + RGUI_SETTINGS_BIND_ANALOG_RIGHT_X_MINUS, + RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_PLUS, + RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_MINUS, + RGUI_SETTINGS_BIND_LAST = RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_MINUS, + RGUI_SETTINGS_BIND_MENU_TOGGLE = RGUI_SETTINGS_BIND_BEGIN + RARCH_MENU_TOGGLE, RGUI_SETTINGS_CUSTOM_BIND, RGUI_SETTINGS_CUSTOM_BIND_ALL, + RGUI_SETTINGS_CUSTOM_BIND_DEFAULT_ALL, RGUI_SETTINGS_CORE_OPTION_NONE = 0xffff, RGUI_SETTINGS_CORE_OPTION_START = 0x10000 @@ -198,7 +210,6 @@ struct rgui_bind_state_port bool buttons[RGUI_MAX_BUTTONS]; int16_t axes[RGUI_MAX_AXES]; uint16_t hats[RGUI_MAX_HATS]; - }; struct rgui_bind_axis_state diff --git a/frontend/menu/rgui.c b/frontend/menu/rgui.c index 5a7b8fb4bf..ae89173194 100644 --- a/frontend/menu/rgui.c +++ b/frontend/menu/rgui.c @@ -33,6 +33,7 @@ #include "../../compat/posix_string.h" #include "../../gfx/shader_parse.h" #include "../../performance.h" +#include "../../input/input_common.h" #ifdef HAVE_OPENGL #include "../../gfx/gl_common.h" @@ -684,13 +685,26 @@ static int rgui_settings_toggle_setting(rgui_handle_t *rgui, unsigned setting, r if (action == RGUI_ACTION_OK) { rgui->binds.target = &g_settings.input.binds[port][0]; - rgui->binds.begin = RGUI_SETTINGS_BIND_B; - rgui->binds.last = RGUI_SETTINGS_BIND_R3; + rgui->binds.begin = RGUI_SETTINGS_BIND_BEGIN; + rgui->binds.last = RGUI_SETTINGS_BIND_LAST; rgui_list_push(rgui->menu_stack, "", RGUI_SETTINGS_CUSTOM_BIND, rgui->selection_ptr); menu_poll_bind_get_rested_axes(&rgui->binds); menu_poll_bind_state(&rgui->binds); } break; + case RGUI_SETTINGS_CUSTOM_BIND_DEFAULT_ALL: + if (action == RGUI_ACTION_OK) + { + struct retro_keybind *target = &g_settings.input.binds[port][0]; + rgui->binds.begin = RGUI_SETTINGS_BIND_BEGIN; + rgui->binds.last = RGUI_SETTINGS_BIND_LAST; + for (unsigned i = RGUI_SETTINGS_BIND_BEGIN; i < RGUI_SETTINGS_BIND_LAST; i++, target++) + { + target->joykey = NO_BTN; + target->joyaxis = AXIS_NONE; + } + } + break; case RGUI_SETTINGS_BIND_UP: case RGUI_SETTINGS_BIND_DOWN: case RGUI_SETTINGS_BIND_LEFT: @@ -707,6 +721,15 @@ static int rgui_settings_toggle_setting(rgui_handle_t *rgui, unsigned setting, r case RGUI_SETTINGS_BIND_R2: case RGUI_SETTINGS_BIND_L3: case RGUI_SETTINGS_BIND_R3: + case RGUI_SETTINGS_BIND_ANALOG_LEFT_X_PLUS: + case RGUI_SETTINGS_BIND_ANALOG_LEFT_X_MINUS: + case RGUI_SETTINGS_BIND_ANALOG_LEFT_Y_PLUS: + case RGUI_SETTINGS_BIND_ANALOG_LEFT_Y_MINUS: + case RGUI_SETTINGS_BIND_ANALOG_RIGHT_X_PLUS: + case RGUI_SETTINGS_BIND_ANALOG_RIGHT_X_MINUS: + case RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_PLUS: + case RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_MINUS: + case RGUI_SETTINGS_BIND_MENU_TOGGLE: if (driver.input->set_keybinds) { unsigned keybind_action = KEYBINDS_ACTION_NONE; @@ -721,11 +744,11 @@ static int rgui_settings_toggle_setting(rgui_handle_t *rgui, unsigned setting, r // FIXME: The array indices here look totally wrong ... Fixed it so it looks kind of sane for now. if (keybind_action != KEYBINDS_ACTION_NONE) driver.input->set_keybinds(driver.input_data, g_settings.input.device[port], port, - setting - RGUI_SETTINGS_BIND_B, keybind_action); + setting - RGUI_SETTINGS_BIND_BEGIN, keybind_action); } else { - struct retro_keybind *bind = &g_settings.input.binds[port][setting - RGUI_SETTINGS_BIND_B]; + struct retro_keybind *bind = &g_settings.input.binds[port][setting - RGUI_SETTINGS_BIND_BEGIN]; if (action == RGUI_ACTION_OK) { rgui->binds.begin = setting; @@ -1514,6 +1537,7 @@ static void rgui_settings_path_populate_entries(rgui_handle_t *rgui) #endif } +// TODO: Move to some extern. Maybe in input_common.c? static void rgui_settings_controller_populate_entries(rgui_handle_t *rgui) { rgui_list_clear(rgui->selection_buf); @@ -1529,24 +1553,15 @@ static void rgui_settings_controller_populate_entries(rgui_handle_t *rgui) if (driver.input && driver.input->set_keybinds) rgui_list_push(rgui->selection_buf, "DPad Emulation", RGUI_SETTINGS_BIND_DPAD_EMULATION, 0); else - rgui_list_push(rgui->selection_buf, "Configure All", RGUI_SETTINGS_CUSTOM_BIND_ALL, 0); // This doesn't make sense on anything else than PC. + { + rgui_list_push(rgui->selection_buf, "Configure All (RetroPad)", RGUI_SETTINGS_CUSTOM_BIND_ALL, 0); // This doesn't make sense on anything else than PC. + rgui_list_push(rgui->selection_buf, "Default All (RetroPad)", RGUI_SETTINGS_CUSTOM_BIND_DEFAULT_ALL, 0); // This doesn't make sense on anything else than PC. + } - rgui_list_push(rgui->selection_buf, "Up", RGUI_SETTINGS_BIND_UP, 0); - rgui_list_push(rgui->selection_buf, "Down", RGUI_SETTINGS_BIND_DOWN, 0); - rgui_list_push(rgui->selection_buf, "Left", RGUI_SETTINGS_BIND_LEFT, 0); - rgui_list_push(rgui->selection_buf, "Right", RGUI_SETTINGS_BIND_RIGHT, 0); - rgui_list_push(rgui->selection_buf, "A (right)", RGUI_SETTINGS_BIND_A, 0); - rgui_list_push(rgui->selection_buf, "B (down)", RGUI_SETTINGS_BIND_B, 0); - rgui_list_push(rgui->selection_buf, "X (top)", RGUI_SETTINGS_BIND_X, 0); - rgui_list_push(rgui->selection_buf, "Y (left)", RGUI_SETTINGS_BIND_Y, 0); - rgui_list_push(rgui->selection_buf, "Start", RGUI_SETTINGS_BIND_START, 0); - rgui_list_push(rgui->selection_buf, "Select", RGUI_SETTINGS_BIND_SELECT, 0); - rgui_list_push(rgui->selection_buf, "L", RGUI_SETTINGS_BIND_L, 0); - rgui_list_push(rgui->selection_buf, "R", RGUI_SETTINGS_BIND_R, 0); - rgui_list_push(rgui->selection_buf, "L2", RGUI_SETTINGS_BIND_L2, 0); - rgui_list_push(rgui->selection_buf, "R2", RGUI_SETTINGS_BIND_R2, 0); - rgui_list_push(rgui->selection_buf, "L3", RGUI_SETTINGS_BIND_L3, 0); - rgui_list_push(rgui->selection_buf, "R3", RGUI_SETTINGS_BIND_R3, 0); + rgui_list_push(rgui->selection_buf, "RGUI Menu Toggle", RGUI_SETTINGS_BIND_MENU_TOGGLE, 0); + unsigned last = (driver.input && driver.input->set_keybinds) ? RGUI_SETTINGS_BIND_R3 : RGUI_SETTINGS_BIND_LAST; + for (unsigned i = RGUI_SETTINGS_BIND_BEGIN; i <= last; i++) + rgui_list_push(rgui->selection_buf, input_bind_to_str[i - RGUI_SETTINGS_BIND_BEGIN], i, 0); } // This only makes sense for PC so far. @@ -1557,27 +1572,8 @@ static int rgui_custom_bind_iterate(rgui_handle_t *rgui, rgui_action_t action) render_text(rgui); - static const char *rgui_key_to_str[] = { - "B (down)", - "Y (left)", - "Select", - "Start", - "D-pad Up", - "D-pad Down", - "D-pad Left", - "D-pad Right", - "A (right)", - "X (top)", - "L (trigger)", - "R (trigger)", - "L2 (trigger)", - "R2 (trigger)", - "L3 (thumb)", - "R3 (thumb)", - }; - char msg[256]; - snprintf(msg, sizeof(msg), "[%s] press joypad (RETURN to skip)", rgui_key_to_str[rgui->binds.begin - RGUI_SETTINGS_BIND_B]); + snprintf(msg, sizeof(msg), "[%s] press joypad (RETURN to skip)", input_bind_to_str[rgui->binds.begin - RGUI_SETTINGS_BIND_BEGIN]); render_messagebox(rgui, msg); struct rgui_bind_state binds = rgui->binds; diff --git a/frontend/menu/rguidisp_bitmap.c b/frontend/menu/rguidisp_bitmap.c index 69560de319..cef420936c 100644 --- a/frontend/menu/rguidisp_bitmap.c +++ b/frontend/menu/rguidisp_bitmap.c @@ -304,7 +304,13 @@ static void render_text(rgui_handle_t *rgui) rgui_list_get_at_offset(rgui->selection_buf, i, &path, &type); char message[256]; char type_str[256]; - unsigned w = (menu_type == RGUI_SETTINGS_INPUT_OPTIONS || menu_type == RGUI_SETTINGS_PATH_OPTIONS || menu_type == RGUI_SETTINGS_CUSTOM_BIND) ? 24 : 19; + + unsigned w = 19; + if (menu_type == RGUI_SETTINGS_INPUT_OPTIONS || menu_type == RGUI_SETTINGS_CUSTOM_BIND) + w = 21; + else if (menu_type == RGUI_SETTINGS_PATH_OPTIONS) + w = 24; + unsigned port = rgui->current_pad; #ifdef HAVE_SHADER_MANAGER @@ -535,6 +541,7 @@ static void render_text(rgui_handle_t *rgui) case RGUI_SETTINGS_PATH_OPTIONS: case RGUI_SETTINGS_OPTIONS: case RGUI_SETTINGS_CUSTOM_BIND_ALL: + case RGUI_SETTINGS_CUSTOM_BIND_DEFAULT_ALL: strlcpy(type_str, "...", sizeof(type_str)); break; #ifdef HAVE_OVERLAY @@ -626,6 +633,15 @@ static void render_text(rgui_handle_t *rgui) case RGUI_SETTINGS_BIND_R2: case RGUI_SETTINGS_BIND_L3: case RGUI_SETTINGS_BIND_R3: + case RGUI_SETTINGS_BIND_ANALOG_LEFT_X_PLUS: + case RGUI_SETTINGS_BIND_ANALOG_LEFT_X_MINUS: + case RGUI_SETTINGS_BIND_ANALOG_LEFT_Y_PLUS: + case RGUI_SETTINGS_BIND_ANALOG_LEFT_Y_MINUS: + case RGUI_SETTINGS_BIND_ANALOG_RIGHT_X_PLUS: + case RGUI_SETTINGS_BIND_ANALOG_RIGHT_X_MINUS: + case RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_PLUS: + case RGUI_SETTINGS_BIND_ANALOG_RIGHT_Y_MINUS: + case RGUI_SETTINGS_BIND_MENU_TOGGLE: { unsigned id = type - RGUI_SETTINGS_BIND_B; struct platform_bind key_label; diff --git a/input/input_common.c b/input/input_common.c index c938b68128..3e6d21315d 100644 --- a/input/input_common.c +++ b/input/input_common.c @@ -794,6 +794,77 @@ const struct input_key_map input_config_key_map[] = { { NULL, RETROK_UNKNOWN }, }; +const char *input_bind_to_str[] = { + "B (down)", + "Y (left)", + "Select", + "Start", + "D-pad Up", + "D-pad Down", + "D-pad Left", + "D-pad Right", + "A (right)", + "X (top)", + "L (trigger)", + "R (trigger)", + "L2 (trigger)", + "R2 (trigger)", + "L3 (thumb)", + "R3 (thumb)", + "Left analog X+ (right)", + "Left analog X- (left)", + "Left analog Y+ (down)", + "Left analog Y- (up)", + "Right analog X+ (right)", + "Right analog X- (left)", + "Right analog Y+ (down)", + "Right analog Y- (up)", +#ifdef RARCH_CONSOLE + "Left analog X D-pad left", + "Left analog X D-pad right", + "Left analog Y D-pad up", + "Left analog Y D-pad down", + "Right analog X D-pad left", + "Right analog X D-pad right", + "Right analog Y D-pad up", + "Right analog Y D-pad down", +#endif + + "Turbo enable", + "Fast forward", + "Fast forward hold", + "Load state", + "Save state", + "Fullscreen toggle", + "Quit RetroArch", + "State slot (+)", + "State slot (-)", + "Rewind", + "Movie record toggle", + "Pause toggle", + "Frame advance", + "Reset game", + "Next shader", + "Previous shader", + "Cheat index (+)", + "Cheat index (-)", + "Cheat toggle", + "Take screenshot", + "DSP plugin config", + "Mute audio", + "Netplay flip players", + "Slow motion", + "Hotkey enable", + "Volume (+)", + "Volume (-)", + "Next overlay", + "Disk eject toggle", + "Disk next", + "Grab mouse toggle", + "RGUI menu toggle", +}; + + static enum retro_key find_sk_bind(const char *str) { for (size_t i = 0; input_config_key_map[i].str; i++) diff --git a/input/input_common.h b/input/input_common.h index 704ce42306..5f5e0c3458 100644 --- a/input/input_common.h +++ b/input/input_common.h @@ -133,6 +133,7 @@ struct input_bind_map unsigned retro_key; }; extern const struct input_bind_map input_config_bind_map[]; +extern const char *input_bind_to_str[]; struct input_key_map {