From 253bb88bfce016c981530eb352f27898e0be26c5 Mon Sep 17 00:00:00 2001 From: meancoot Date: Mon, 26 Aug 2013 23:56:26 -0400 Subject: [PATCH] (OSX) More settings menu work (now supports all input bindings for player 1) --- apple/OSX/settings.m | 86 ++++++++++++++++++++++++++++------ apple/RetroArch/setting_data.h | 60 ++++++++++++++---------- 2 files changed, 105 insertions(+), 41 deletions(-) diff --git a/apple/OSX/settings.m b/apple/OSX/settings.m index 5d248a2b26..1bf695befc 100644 --- a/apple/OSX/settings.m +++ b/apple/OSX/settings.m @@ -49,6 +49,40 @@ static uint32_t key_id_for_name(const char* name) #define key_name_for_rk(X) key_name_for_id(input_translate_rk_to_keysym(X)) #define key_rk_for_name(X) input_translate_keysym_to_rk(key_id_for_name(X)) +static const char* get_input_config_key(const rarch_setting_t* setting, const char* type) +{ + static char buffer[32]; + snprintf(buffer, 32, "input_player%d_%s%c%s", setting->input_player, setting->name, type ? '_' : '\0', type); + return buffer; +} + +static const char* get_button_name(const rarch_setting_t* setting) +{ + static char buffer[32]; + + if (BINDFOR(*setting).joykey == NO_BTN) + return "nul"; + + snprintf(buffer, 32, "%lld", BINDFOR(*setting).joykey); + return buffer; +} + +static const char* get_axis_name(const rarch_setting_t* setting) +{ + static char buffer[32]; + + uint32_t joyaxis = BINDFOR(*setting).joyaxis; + + if (AXIS_NEG_GET(joyaxis) != AXIS_DIR_NONE) + snprintf(buffer, 8, "-%d", AXIS_NEG_GET(joyaxis)); + else if (AXIS_POS_GET(joyaxis) != AXIS_DIR_NONE) + snprintf(buffer, 8, "+%d", AXIS_POS_GET(joyaxis)); + else + return "nul"; + + return buffer; +} + @interface RAInputBinder : NSWindow @end @@ -134,8 +168,9 @@ static uint32_t key_id_for_name(const char* name) // Input Binding - (void)updateInputString { - self.stringValue = [NSString stringWithFormat:@"[KB:%s] [JS:%lld] [AX:nul]", key_name_for_rk(BINDFOR(*_setting).key), - BINDFOR(*_setting).joykey]; + self.stringValue = [NSString stringWithFormat:@"[KB:%s] [JS:%s] [AX:%s]", key_name_for_rk(BINDFOR(*_setting).key), + get_button_name(_setting), + get_axis_name(_setting)]; } - (void)dismissBinder @@ -174,6 +209,19 @@ static uint32_t key_id_for_name(const char* name) } } } + + // Pad Axis + for (int i = 0; i < 4; i++) + { + int16_t value = g_current_input_data.pad_axis[0][i]; + + if (abs(value) > 0x4000) + { + BINDFOR(*_setting).joyaxis = (value > 0x1000) ? AXIS_POS(i) : AXIS_NEG(i); + [self dismissBinder]; + break; + } + } } - (IBAction)doGetBind:(id)sender @@ -214,10 +262,10 @@ static uint32_t key_id_for_name(const char* name) NSMutableArray* thisGroup = nil; NSMutableArray* thisSubGroup = nil; _settings = [NSMutableArray array]; - + memcpy(&fake_settings, &g_settings, sizeof(struct settings)); memcpy(&fake_extern, &g_extern, sizeof(struct global)); - + for (int i = 0; setting_data[i].type; i ++) { switch (setting_data[i].type) @@ -264,20 +312,24 @@ static uint32_t key_id_for_name(const char* name) - (void)load { config_file_t* conf = config_file_new([RetroArch_OSX get].configPath.UTF8String); + for (int i = 0; setting_data[i].type; i ++) { switch (setting_data[i].type) { - case ST_BOOL: config_set_bool (conf, setting_data[i].name, * (bool*)setting_data[i].value); break; - case ST_INT: config_set_int (conf, setting_data[i].name, * (int*)setting_data[i].value); break; - case ST_FLOAT: config_set_float (conf, setting_data[i].name, *(float*)setting_data[i].value); break; - case ST_PATH: config_set_string(conf, setting_data[i].name, (char*)setting_data[i].value); break; - case ST_STRING: config_set_string(conf, setting_data[i].name, (char*)setting_data[i].value); break; + case ST_BOOL: config_get_bool (conf, setting_data[i].name, (bool*)setting_data[i].value); break; + case ST_INT: config_get_int (conf, setting_data[i].name, (int*)setting_data[i].value); break; + case ST_FLOAT: config_get_float (conf, setting_data[i].name, (float*)setting_data[i].value); break; + case ST_PATH: config_get_array (conf, setting_data[i].name, (char*)setting_data[i].value, setting_data[i].size); break; + case ST_STRING: config_get_array (conf, setting_data[i].name, (char*)setting_data[i].value, setting_data[i].size); break; - case ST_BIND: input_config_parse_key(conf, "input_player1", input_config_bind_map[0].base, setting_data[i].value); - input_config_parse_joy_button(conf, "input_player1", input_config_bind_map[0].base, setting_data[i].value); - input_config_parse_joy_axis(conf, "input_player1", input_config_bind_map[0].base, setting_data[i].value); - break; + case ST_BIND: + { + input_config_parse_key (conf, "input_player1", setting_data[i].name, setting_data[i].value); + input_config_parse_joy_button(conf, "input_player1", setting_data[i].name, setting_data[i].value); + input_config_parse_joy_axis (conf, "input_player1", setting_data[i].name, setting_data[i].value); + break; + } case ST_HEX: break; default: break; @@ -288,7 +340,9 @@ static uint32_t key_id_for_name(const char* name) - (void)windowWillClose:(NSNotification *)notification { - config_file_t* conf = config_file_new(0); + config_file_t* conf = config_file_new([RetroArch_OSX get].configPath.UTF8String); + conf = conf ? conf : config_file_new(0); + for (int i = 0; setting_data[i].type; i ++) { switch (setting_data[i].type) @@ -301,7 +355,9 @@ static uint32_t key_id_for_name(const char* name) case ST_BIND: { - config_set_string(conf, setting_data[i].name, key_name_for_rk(BINDFOR(setting_data[i]).key)); + config_set_string(conf, get_input_config_key(&setting_data[i], 0 ), key_name_for_rk(BINDFOR(setting_data[i]).key)); + config_set_string(conf, get_input_config_key(&setting_data[i], "btn" ), get_button_name(&setting_data[i])); + config_set_string(conf, get_input_config_key(&setting_data[i], "axis"), get_axis_name(&setting_data[i])); break; } diff --git a/apple/RetroArch/setting_data.h b/apple/RetroArch/setting_data.h index a1faaddd44..3fcac23459 100644 --- a/apple/RetroArch/setting_data.h +++ b/apple/RetroArch/setting_data.h @@ -31,11 +31,9 @@ typedef struct uint32_t size; const char* short_description; - const char* long_description; - - const char** values; uint32_t input_player; + double min; double max; bool allow_blank; @@ -52,13 +50,14 @@ extern struct global fake_extern; #define END_GROUP() { ST_END_GROUP }, #define START_SUB_GROUP(NAME) { ST_SUB_GROUP, NAME }, #define END_SUB_GROUP() { ST_END_SUB_GROUP }, -#define CONFIG_BOOL(TARGET, NAME, SHORT) { ST_BOOL, NAME, &TARGET, sizeof(TARGET), SHORT, 0, 0, 0, 0.0, 0.0, false }, -#define CONFIG_INT(TARGET, NAME, SHORT) { ST_INT, NAME, &TARGET, sizeof(TARGET), SHORT, 0, 0, 0, 0.0, 0.0, false }, -#define CONFIG_FLOAT(TARGET, NAME, SHORT) { ST_FLOAT, NAME, &TARGET, sizeof(TARGET), SHORT, 0, 0, 0, 0.0, 0.0, false }, -#define CONFIG_PATH(TARGET, NAME, SHORT) { ST_PATH, NAME, &TARGET, sizeof(TARGET), SHORT, 0, 0, 0, 0.0, 0.0, false }, -#define CONFIG_STRING(TARGET, NAME, SHORT) { ST_STRING, NAME, &TARGET, sizeof(TARGET), SHORT, 0, 0, 0, 0.0, 0.0, false }, -#define CONFIG_HEX(TARGET, NAME, SHORT) { ST_HEX, NAME, &TARGET, sizeof(TARGET), SHORT, 0, 0, 0, 0.0, 0.0, false }, -#define CONFIG_BIND(TARGET, NAME, SHORT) { ST_BIND, NAME, &TARGET, sizeof(TARGET), SHORT }, +#define CONFIG_BOOL(TARGET, NAME, SHORT) { ST_BOOL, NAME, &TARGET, sizeof(TARGET), SHORT }, +#define CONFIG_INT(TARGET, NAME, SHORT) { ST_INT, NAME, &TARGET, sizeof(TARGET), SHORT }, +#define CONFIG_FLOAT(TARGET, NAME, SHORT) { ST_FLOAT, NAME, &TARGET, sizeof(TARGET), SHORT }, +#define CONFIG_PATH(TARGET, NAME, SHORT) { ST_PATH, NAME, &TARGET, sizeof(TARGET), SHORT }, +#define CONFIG_STRING(TARGET, NAME, SHORT) { ST_STRING, NAME, &TARGET, sizeof(TARGET), SHORT }, +#define CONFIG_HEX(TARGET, NAME, SHORT) { ST_HEX, NAME, &TARGET, sizeof(TARGET), SHORT }, + +#define CONFIG_BIND(TARGET, PLAYER, NAME, SHORT) { ST_BIND, NAME, &TARGET, sizeof(TARGET), SHORT, PLAYER }, const rarch_setting_t setting_data[] = { @@ -183,22 +182,31 @@ const rarch_setting_t setting_data[] = END_SUB_GROUP() START_SUB_GROUP("Player 1") - CONFIG_BIND(g_settings.input.binds[0][ 0], "input_player1_b", "B button (down)") - CONFIG_BIND(g_settings.input.binds[0][ 1], "input_player1_y", "Y button (left)") - CONFIG_BIND(g_settings.input.binds[0][ 2], "input_player1_select", "Select button") - CONFIG_BIND(g_settings.input.binds[0][ 3], "input_player1_start", "Start button") - CONFIG_BIND(g_settings.input.binds[0][ 4], "input_player1_up", "Up D-pad") - CONFIG_BIND(g_settings.input.binds[0][ 5], "input_player1_down", "Down D-pad") - CONFIG_BIND(g_settings.input.binds[0][ 6], "input_player1_left", "Left D-pad") - CONFIG_BIND(g_settings.input.binds[0][ 7], "input_player1_right", "Right D-pad") - CONFIG_BIND(g_settings.input.binds[0][ 8], "input_player1_a", "A button (right)") - CONFIG_BIND(g_settings.input.binds[0][ 9], "input_player1_x", "X button (top)") - CONFIG_BIND(g_settings.input.binds[0][10], "input_player1_l", "L button (left shoulder)") - CONFIG_BIND(g_settings.input.binds[0][11], "input_player1_r", "R button (right shoulder)") - CONFIG_BIND(g_settings.input.binds[0][12], "input_player1_l2", "L2 button (left shoulder #2)") - CONFIG_BIND(g_settings.input.binds[0][13], "input_player1_r2", "R2 button (right shoulder #2)") - CONFIG_BIND(g_settings.input.binds[0][14], "input_player1_l3", "L3 button (left analog button)") - CONFIG_BIND(g_settings.input.binds[0][15], "input_player1_r3", "R3 button (right analog button)") + CONFIG_BIND(g_settings.input.binds[0][ 0], 1, "b", "B button (down)") + CONFIG_BIND(g_settings.input.binds[0][ 1], 1, "y", "Y button (left)") + CONFIG_BIND(g_settings.input.binds[0][ 2], 1, "select", "Select button") + CONFIG_BIND(g_settings.input.binds[0][ 3], 1, "start", "Start button") + CONFIG_BIND(g_settings.input.binds[0][ 4], 1, "up", "Up D-pad") + CONFIG_BIND(g_settings.input.binds[0][ 5], 1, "down", "Down D-pad") + CONFIG_BIND(g_settings.input.binds[0][ 6], 1, "left", "Left D-pad") + CONFIG_BIND(g_settings.input.binds[0][ 7], 1, "right", "Right D-pad") + CONFIG_BIND(g_settings.input.binds[0][ 8], 1, "a", "A button (right)") + CONFIG_BIND(g_settings.input.binds[0][ 9], 1, "x", "X button (top)") + CONFIG_BIND(g_settings.input.binds[0][10], 1, "l", "L button (left shoulder)") + CONFIG_BIND(g_settings.input.binds[0][11], 1, "r", "R button (right shoulder)") + CONFIG_BIND(g_settings.input.binds[0][12], 1, "l2", "L2 button (left shoulder #2)") + CONFIG_BIND(g_settings.input.binds[0][13], 1, "r2", "R2 button (right shoulder #2)") + CONFIG_BIND(g_settings.input.binds[0][14], 1, "l3", "L3 button (left analog button)") + CONFIG_BIND(g_settings.input.binds[0][15], 1, "r3", "R3 button (right analog button)") + CONFIG_BIND(g_settings.input.binds[0][16], 1, "turbo", "Turbo enable") + CONFIG_BIND(g_settings.input.binds[0][17], 1, "l_x_plus", "Left analog X+ (right)") + CONFIG_BIND(g_settings.input.binds[0][18], 1, "l_x_minus", "Left analog X- (left)") + CONFIG_BIND(g_settings.input.binds[0][19], 1, "l_y_plus", "Left analog Y+ (down)") + CONFIG_BIND(g_settings.input.binds[0][20], 1, "l_y_minus", "Left analog Y- (up)") + CONFIG_BIND(g_settings.input.binds[0][21], 1, "r_x_plus", "Right analog X+ (right)") + CONFIG_BIND(g_settings.input.binds[0][22], 1, "r_x_minus", "Right analog X- (left)") + CONFIG_BIND(g_settings.input.binds[0][23], 1, "r_y_plus", "Right analog Y+ (down)") + CONFIG_BIND(g_settings.input.binds[0][24], 1, "r_y_minus", "Right analog Y- (up)") END_SUB_GROUP() END_GROUP()