Add RGUI menu toggle config.

This commit is contained in:
Themaister 2013-09-29 20:40:04 +02:00
parent f1bfaaf420
commit 4f2de6d578
5 changed files with 139 additions and 44 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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++)

View File

@ -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
{