diff --git a/command.h b/command.h
index af3b6b11e1..f065c71571 100644
--- a/command.h
+++ b/command.h
@@ -136,6 +136,8 @@ enum event_command
CMD_EVENT_OVERLAY_SET_SCALE_FACTOR,
/* Sets current alpha modulation for overlay. */
CMD_EVENT_OVERLAY_SET_ALPHA_MOD,
+ /* Sets diagonal sensitivities of overlay eightway areas. */
+ CMD_EVENT_OVERLAY_SET_EIGHTWAY_DIAGONAL_SENSITIVITY,
/* Cycle to next overlay. */
CMD_EVENT_OVERLAY_NEXT,
/* Deinitializes overlay. */
diff --git a/config.def.h b/config.def.h
index 91b079f808..0b979309a0 100644
--- a/config.def.h
+++ b/config.def.h
@@ -889,6 +889,9 @@ static const unsigned input_backtouch_toggle = false;
#define DEFAULT_OVERLAY_SHOW_INPUTS_PORT 0
+#define DEFAULT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY 80
+#define DEFAULT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY 50
+
#if defined(ANDROID) || defined(_WIN32) || defined(HAVE_STEAM)
#define DEFAULT_MENU_SWAP_OK_CANCEL_BUTTONS true
#else
diff --git a/configuration.c b/configuration.c
index af3fc8f43c..20bc4d6b88 100644
--- a/configuration.c
+++ b/configuration.c
@@ -2305,6 +2305,8 @@ static struct config_uint_setting *populate_settings_uint(
#if defined(HAVE_OVERLAY)
SETTING_UINT("input_overlay_show_inputs", &settings->uints.input_overlay_show_inputs, true, DEFAULT_OVERLAY_SHOW_INPUTS, false);
SETTING_UINT("input_overlay_show_inputs_port", &settings->uints.input_overlay_show_inputs_port, true, DEFAULT_OVERLAY_SHOW_INPUTS_PORT, false);
+ SETTING_UINT("input_overlay_dpad_diagonal_sensitivity", &settings->uints.input_overlay_dpad_diagonal_sensitivity, true, DEFAULT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, false);
+ SETTING_UINT("input_overlay_abxy_diagonal_sensitivity", &settings->uints.input_overlay_abxy_diagonal_sensitivity, true, DEFAULT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, false);
#endif
SETTING_UINT("video_msg_bgcolor_red", &settings->uints.video_msg_bgcolor_red, true, DEFAULT_MESSAGE_BGCOLOR_RED, false);
diff --git a/configuration.h b/configuration.h
index 44d53ecaa5..3f3610c20a 100644
--- a/configuration.h
+++ b/configuration.h
@@ -299,8 +299,12 @@ typedef struct settings
unsigned camera_width;
unsigned camera_height;
+#ifdef HAVE_OVERLAY
unsigned input_overlay_show_inputs;
unsigned input_overlay_show_inputs_port;
+ unsigned input_overlay_dpad_diagonal_sensitivity;
+ unsigned input_overlay_abxy_diagonal_sensitivity;
+#endif
unsigned run_ahead_frames;
diff --git a/input/input_driver.c b/input/input_driver.c
index b230d6bec3..bbc64c55aa 100644
--- a/input/input_driver.c
+++ b/input/input_driver.c
@@ -18,6 +18,7 @@
* with RetroArch. If not, see .
**/
+#define _USE_MATH_DEFINES
#include
#include
#include
@@ -1220,6 +1221,10 @@ static bool input_overlay_add_inputs_inner(overlay_desc_t *desc,
}
break;
+ case OVERLAY_TYPE_DPAD_AREA:
+ case OVERLAY_TYPE_ABXY_AREA:
+ return desc->updated;
+
case OVERLAY_TYPE_KEYBOARD:
if (ol_state ?
OVERLAY_GET_KEY(ol_state, desc->retro_key_idx) :
@@ -1257,6 +1262,120 @@ static bool input_overlay_add_inputs(input_overlay_t *ol,
return button_pressed;
}
+static void input_overlay_get_eightway_slope_limits(
+ const unsigned diagonal_sensitivity,
+ float* low_slope, float* high_slope)
+{
+ /* Sensitivity setting is the relative size of diagonal zones to
+ * cardinal zones. Convert to fraction of 45 deg span (max diagonal).
+ */
+ float f = 2.0f * diagonal_sensitivity
+ / (100.0f + diagonal_sensitivity);
+
+ float high_angle /* 67.5 deg max */
+ = (f * (0.375*M_PI) + (1.0f - f) * (0.25*M_PI));
+ float low_angle /* 22.5 deg min */
+ = (f * (0.125*M_PI) + (1.0f - f) * (0.25*M_PI));
+
+ *high_slope = tan(high_angle);
+ *low_slope = tan(low_angle);
+}
+
+/**
+ * input_overlay_set_eightway_diagonal_sensitivity:
+ *
+ * Gets the slope limits defining each eightway type's diagonal zones.
+ */
+void input_overlay_set_eightway_diagonal_sensitivity()
+{
+ settings_t *settings = config_get_ptr();
+ input_driver_state_t *input_st = input_state_get_ptr();
+
+ input_overlay_get_eightway_slope_limits(
+ settings->uints.input_overlay_dpad_diagonal_sensitivity,
+ &input_st->overlay_eightway_dpad_slopes[0],
+ &input_st->overlay_eightway_dpad_slopes[1]);
+
+ input_overlay_get_eightway_slope_limits(
+ settings->uints.input_overlay_abxy_diagonal_sensitivity,
+ &input_st->overlay_eightway_abxy_slopes[0],
+ &input_st->overlay_eightway_abxy_slopes[1]);
+}
+
+/**
+ * input_overlay_get_eightway_state:
+ * @desc : overlay descriptor handle for an eightway area
+ * @out : current input state to be OR'd with eightway state
+ * @x_dist : X offset from eightway area center
+ * @y_dist : Y offset from eightway area center
+ *
+ * Gets the eightway area's current input state based on (@x_dist, @y_dist).
+ **/
+static INLINE void input_overlay_get_eightway_state(
+ const struct overlay_desc *desc, input_bits_t *out,
+ float x_dist, float y_dist)
+{
+ overlay_eightway_config_t *eightway = desc->eightway_config;
+ uint32_t *data;
+ float abs_slope;
+
+ x_dist /= desc->range_x;
+ y_dist /= desc->range_y;
+
+ if (x_dist == 0.0f)
+ x_dist = 0.0001f;
+ abs_slope = fabs(y_dist / x_dist);
+
+ if (x_dist > 0.0f)
+ {
+ if (y_dist < 0.0f)
+ {
+ /* Q1 */
+ if (abs_slope > *eightway->slope_high)
+ data = eightway->up.data;
+ else if (abs_slope < *eightway->slope_low)
+ data = eightway->right.data;
+ else
+ data = eightway->up_right.data;
+ }
+ else
+ {
+ /* Q4 */
+ if (abs_slope > *eightway->slope_high)
+ data = eightway->down.data;
+ else if (abs_slope < *eightway->slope_low)
+ data = eightway->right.data;
+ else
+ data = eightway->down_right.data;
+ }
+ }
+ else
+ {
+ if (y_dist < 0.0f)
+ {
+ /* Q2 */
+ if (abs_slope > *eightway->slope_high)
+ data = eightway->up.data;
+ else if (abs_slope < *eightway->slope_low)
+ data = eightway->left.data;
+ else
+ data = eightway->up_left.data;
+ }
+ else
+ {
+ /* Q3 */
+ if (abs_slope > *eightway->slope_high)
+ data = eightway->down.data;
+ else if (abs_slope < *eightway->slope_low)
+ data = eightway->left.data;
+ else
+ data = eightway->down_left.data;
+ }
+ }
+
+ bits_or_bits(out->data, data, CUSTOM_BINDS_U32_COUNT);
+}
+
/**
* inside_hitbox:
* @desc : Overlay descriptor handle.
@@ -1347,6 +1466,11 @@ void input_overlay_poll(
if (desc->retro_key_idx < RETROK_LAST)
OVERLAY_SET_KEY(out, desc->retro_key_idx);
break;
+ case OVERLAY_TYPE_DPAD_AREA:
+ case OVERLAY_TYPE_ABXY_AREA:
+ input_overlay_get_eightway_state(
+ desc, &out->buttons, x_dist, y_dist);
+ break;
case OVERLAY_TYPE_ANALOG_RIGHT:
base = 2;
/* fall-through */
@@ -1761,7 +1885,12 @@ void input_overlay_free_overlay(struct overlay *overlay)
return;
for (i = 0; i < overlay->size; i++)
+ {
image_texture_free(&overlay->descs[i].image);
+ if (overlay->descs[i].eightway_config)
+ free(overlay->descs[i].eightway_config);
+ overlay->descs[i].eightway_config = NULL;
+ }
if (overlay->load_images)
free(overlay->load_images);
@@ -3365,9 +3494,16 @@ static void input_overlay_loaded(retro_task_t *task,
if (data->overlay_enable)
{
#ifdef HAVE_MENU
+ struct menu_state *menu_st = menu_state_get_ptr();
+ bool refresh = false;
+
+ /* Update menu entries */
+ menu_st->overlay_types = data->overlay_types;
+ menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh);
+
/* We can't display when the menu is up */
if ( data->hide_in_menu
- && (menu_state_get_ptr()->flags & MENU_ST_FLAG_ALIVE))
+ && (menu_st->flags & MENU_ST_FLAG_ALIVE))
goto abort_load;
#endif
@@ -3433,6 +3569,8 @@ static void input_overlay_loaded(retro_task_t *task,
input_overlay_enable,
input_st->overlay_ptr);
+ input_overlay_set_eightway_diagonal_sensitivity();
+
return;
abort_load:
@@ -3479,14 +3617,6 @@ void input_overlay_init(void)
input_overlay_deinit();
-#ifdef HAVE_MENU
- /* Cancel load if 'hide_in_menu' is enabled and
- * menu is currently active */
- if (overlay_hide_in_menu)
- load_enabled = load_enabled && !(menu_state_get_ptr()->flags &
- MENU_ST_FLAG_ALIVE);
-#endif
-
/* Cancel load if 'hide_when_gamepad_connected' is
* enabled and a gamepad is currently connected */
if (overlay_hide_when_gamepad_connected)
diff --git a/input/input_driver.h b/input/input_driver.h
index e838912b2f..ffa71e0e53 100644
--- a/input/input_driver.h
+++ b/input/input_driver.h
@@ -427,6 +427,8 @@ typedef struct
#ifdef HAVE_OVERLAY
input_overlay_t *overlay_ptr;
enum overlay_visibility *overlay_visibility;
+ float overlay_eightway_dpad_slopes[2];
+ float overlay_eightway_abxy_slopes[2];
#endif
uint16_t flags;
#ifdef HAVE_NETWORKGAMEPAD
diff --git a/input/input_overlay.h b/input/input_overlay.h
index cc6ed95617..5a879959cd 100644
--- a/input/input_overlay.h
+++ b/input/input_overlay.h
@@ -32,6 +32,8 @@
#define MAX_VISIBILITY 32
+#define CUSTOM_BINDS_U32_COUNT ((RARCH_CUSTOM_BIND_LIST_END - 1) / 32 + 1)
+
RETRO_BEGIN_DECLS
/* Overlay driver acts as a medium between input drivers
@@ -68,6 +70,8 @@ enum overlay_type
OVERLAY_TYPE_BUTTONS = 0,
OVERLAY_TYPE_ANALOG_LEFT,
OVERLAY_TYPE_ANALOG_RIGHT,
+ OVERLAY_TYPE_DPAD_AREA,
+ OVERLAY_TYPE_ABXY_AREA,
OVERLAY_TYPE_KEYBOARD
};
@@ -116,6 +120,23 @@ enum overlay_show_input_type
OVERLAY_SHOW_INPUT_LAST
};
+typedef struct overlay_eightway_config
+{
+ input_bits_t up;
+ input_bits_t right;
+ input_bits_t down;
+ input_bits_t left;
+
+ input_bits_t up_right;
+ input_bits_t up_left;
+ input_bits_t down_right;
+ input_bits_t down_left;
+
+ /* diagonal sensitivity */
+ float* slope_high;
+ float* slope_low;
+} overlay_eightway_config_t;
+
struct overlay_desc
{
struct texture_image image;
@@ -152,6 +173,8 @@ struct overlay_desc
/* This is a bit mask of all input binds to set with this overlay control */
input_bits_t button_mask;
+ overlay_eightway_config_t *eightway_config;
+
char next_index_name[64];
};
@@ -290,6 +313,7 @@ typedef struct
bool overlay_enable;
bool hide_in_menu;
bool hide_when_gamepad_connected;
+ uint16_t overlay_types;
} overlay_task_data_t;
void input_overlay_free_overlay(struct overlay *overlay);
@@ -387,6 +411,13 @@ enum overlay_visibility input_overlay_get_visibility(
enum overlay_visibility *visibility,
int overlay_idx);
+/**
+ * input_overlay_set_eightway_diagonal_sensitivity:
+ *
+ * Gets the slope limits defining each eightway type's diagonal zones.
+ */
+void input_overlay_set_eightway_diagonal_sensitivity();
+
/**
* input_overlay_free:
* @ol : Overlay handle.
diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h
index 317c223792..007830faf2 100644
--- a/intl/msg_hash_lbl.h
+++ b/intl/msg_hash_lbl.h
@@ -1702,6 +1702,14 @@ MSG_HASH(
MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE,
"input_overlay_auto_scale"
)
+MSG_HASH(
+ MENU_ENUM_LABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY,
+ "input_overlay_dpad_diagonal_sensitivity"
+ )
+MSG_HASH(
+ MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY,
+ "input_overlay_abxy_diagonal_sensitivity"
+ )
MSG_HASH(
MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR,
"input_poll_type_behavior"
diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h
index 00b650dc57..05ba4df4b1 100644
--- a/intl/msg_hash_us.h
+++ b/intl/msg_hash_us.h
@@ -4046,6 +4046,22 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_INPUT_OVERLAY_AUTO_SCALE,
"Automatically adjust overlay scale and UI element spacing to match screen aspect ratio. Produces best results with controller overlays."
)
+MSG_HASH(
+ MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY,
+ "D-Pad Diagonal Sensitivity"
+ )
+MSG_HASH(
+ MENU_ENUM_SUBLABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY,
+ "Adjust the size of diagonal zones. Set to 100% for 8-way symmetry."
+ )
+MSG_HASH(
+ MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY,
+ "ABXY Overlap Sensitivity"
+ )
+MSG_HASH(
+ MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY,
+ "Adjust the size of overlap zones in the face button diamond. Set to 100% for 8-way symmetry."
+ )
MSG_HASH(
MENU_ENUM_LABEL_VALUE_OVERLAY,
"Overlay"
diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c
index f63587c48d..10b1eedf19 100644
--- a/menu/cbs/menu_cbs_sublabel.c
+++ b/menu/cbs/menu_cbs_sublabel.c
@@ -607,6 +607,8 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_hide_when_gamepad_conn
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_show_mouse_cursor, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_MOUSE_CURSOR)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_auto_rotate, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_AUTO_ROTATE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_auto_scale, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_AUTO_SCALE)
+DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_dpad_diag_sens, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY)
+DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_abxy_diag_sens, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_content_collection_list, MENU_ENUM_SUBLABEL_PLAYLISTS_TAB)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_scale_integer_overscale, MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER_OVERSCALE)
@@ -3795,6 +3797,12 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_overlay_auto_scale);
break;
+ case MENU_ENUM_LABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY:
+ BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_overlay_dpad_diag_sens);
+ break;
+ case MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY:
+ BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_overlay_abxy_diag_sens);
+ break;
case MENU_ENUM_LABEL_VIDEO_FONT_SIZE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_font_size);
break;
diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c
index 9df5e22d57..d502e332f2 100644
--- a/menu/menu_displaylist.c
+++ b/menu/menu_displaylist.c
@@ -9017,6 +9017,7 @@ unsigned menu_displaylist_build_list(
#if defined(HAVE_OVERLAY)
case DISPLAYLIST_ONSCREEN_OVERLAY_SETTINGS_LIST:
{
+ struct menu_state *menu_st = menu_state_get_ptr();
bool input_overlay_enable = settings->bools.input_overlay_enable;
bool input_overlay_auto_scale = settings->bools.input_overlay_auto_scale;
enum overlay_show_input_type
@@ -9035,6 +9036,8 @@ unsigned menu_displaylist_build_list(
{MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_SCALE, PARSE_ONLY_BOOL, false },
{MENU_ENUM_LABEL_OVERLAY_PRESET, PARSE_ONLY_PATH, false },
{MENU_ENUM_LABEL_OVERLAY_OPACITY, PARSE_ONLY_FLOAT, false },
+ {MENU_ENUM_LABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY, PARSE_ONLY_UINT, false },
+ {MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY, PARSE_ONLY_UINT, false },
{MENU_ENUM_LABEL_OVERLAY_SCALE_LANDSCAPE, PARSE_ONLY_FLOAT, false },
{MENU_ENUM_LABEL_OVERLAY_ASPECT_ADJUST_LANDSCAPE, PARSE_ONLY_FLOAT, false },
{MENU_ENUM_LABEL_OVERLAY_X_SEPARATION_LANDSCAPE, PARSE_ONLY_FLOAT, false },
@@ -9086,6 +9089,16 @@ unsigned menu_displaylist_build_list(
!input_overlay_auto_scale)
build_list[i].checked = true;
break;
+ case MENU_ENUM_LABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY:
+ if (input_overlay_enable &&
+ BIT16_GET(menu_st->overlay_types, OVERLAY_TYPE_DPAD_AREA))
+ build_list[i].checked = true;
+ break;
+ case MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY:
+ if (input_overlay_enable &&
+ BIT16_GET(menu_st->overlay_types, OVERLAY_TYPE_ABXY_AREA))
+ build_list[i].checked = true;
+ break;
default:
break;
}
diff --git a/menu/menu_driver.h b/menu/menu_driver.h
index f869fb4edc..79f7fe1e02 100644
--- a/menu/menu_driver.h
+++ b/menu/menu_driver.h
@@ -548,6 +548,10 @@ struct menu_state
char input_dialog_kb_label[256];
#endif
unsigned char kb_key_state[RETROK_LAST];
+
+#ifdef HAVE_OVERLAY
+ uint16_t overlay_types;
+#endif
};
typedef struct menu_content_ctx_defer_info
diff --git a/menu/menu_setting.c b/menu/menu_setting.c
index 109a492fd9..d3a36066c4 100644
--- a/menu/menu_setting.c
+++ b/menu/menu_setting.c
@@ -15432,6 +15432,44 @@ static bool setting_append_list(
menu_settings_list_current_add_range(list, list_info, 0, 1, 0.01, true, true);
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
+ CONFIG_UINT(
+ list, list_info,
+ &settings->uints.input_overlay_dpad_diagonal_sensitivity,
+ MENU_ENUM_LABEL_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY,
+ MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY,
+ DEFAULT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY,
+ &group_info,
+ &subgroup_info,
+ parent_group,
+ general_write_handler,
+ general_read_handler
+ );
+ (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
+ (*list)[list_info->index - 1].get_string_representation =
+ &setting_get_string_representation_percentage;
+ MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_EIGHTWAY_DIAGONAL_SENSITIVITY);
+ menu_settings_list_current_add_range(list, list_info, 0, 100, 1, true, true);
+ SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
+
+ CONFIG_UINT(
+ list, list_info,
+ &settings->uints.input_overlay_abxy_diagonal_sensitivity,
+ MENU_ENUM_LABEL_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY,
+ MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY,
+ DEFAULT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY,
+ &group_info,
+ &subgroup_info,
+ parent_group,
+ general_write_handler,
+ general_read_handler
+ );
+ (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
+ (*list)[list_info->index - 1].get_string_representation =
+ &setting_get_string_representation_percentage;
+ MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_EIGHTWAY_DIAGONAL_SENSITIVITY);
+ menu_settings_list_current_add_range(list, list_info, 0, 100, 1, true, true);
+ SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
+
CONFIG_FLOAT(
list, list_info,
&settings->floats.input_overlay_scale_landscape,
diff --git a/msg_hash.h b/msg_hash.h
index dc9dc4bb1b..456dd5c47f 100644
--- a/msg_hash.h
+++ b/msg_hash.h
@@ -1063,6 +1063,8 @@ enum msg_hash_enums
MENU_LABEL(INPUT_OVERLAY_SHOW_MOUSE_CURSOR),
MENU_LABEL(INPUT_OVERLAY_AUTO_ROTATE),
MENU_LABEL(INPUT_OVERLAY_AUTO_SCALE),
+ MENU_LABEL(INPUT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY),
+ MENU_LABEL(INPUT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY),
MENU_LABEL(INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE),
MENU_LABEL(INPUT_SMALL_KEYBOARD_ENABLE),
MENU_LABEL(INPUT_TOUCH_ENABLE),
diff --git a/retroarch.c b/retroarch.c
index 8952d10b4a..fa29e07009 100644
--- a/retroarch.c
+++ b/retroarch.c
@@ -2457,6 +2457,11 @@ bool command_event(enum event_command cmd, void *data)
input_overlay_set_alpha_mod(input_st->overlay_visibility,
input_st->overlay_ptr, input_overlay_opacity);
}
+#endif
+ break;
+ case CMD_EVENT_OVERLAY_SET_EIGHTWAY_DIAGONAL_SENSITIVITY:
+#ifdef HAVE_OVERLAY
+ input_overlay_set_eightway_diagonal_sensitivity();
#endif
break;
case CMD_EVENT_AUDIO_REINIT:
diff --git a/runloop.c b/runloop.c
index a5604c0694..4a86c62796 100644
--- a/runloop.c
+++ b/runloop.c
@@ -6616,7 +6616,6 @@ MENU_ST_FLAG_IS_BINDING;
unsigned video_driver_width = video_st->width;
unsigned video_driver_height = video_st->height;
bool check_next_rotation = true;
- bool input_overlay_hide_in_menu = settings->bools.input_overlay_hide_in_menu;
bool input_overlay_hide_when_gamepad_connected = settings->bools.input_overlay_hide_when_gamepad_connected;
bool input_overlay_auto_rotate = settings->bools.input_overlay_auto_rotate;
@@ -6646,8 +6645,7 @@ MENU_ST_FLAG_IS_BINDING;
prev_overlay_restore = true;
else if (prev_overlay_restore)
{
- if (!input_overlay_hide_in_menu)
- input_overlay_init();
+ input_overlay_init();
prev_overlay_restore = false;
}
diff --git a/tasks/task_overlay.c b/tasks/task_overlay.c
index 3781d40320..3cc342caa3 100644
--- a/tasks/task_overlay.c
+++ b/tasks/task_overlay.c
@@ -56,6 +56,8 @@ struct overlay_loader
bool overlay_enable;
bool overlay_hide_in_menu;
bool overlay_hide_when_gamepad_connected;
+
+ uint16_t overlay_types;
};
static void task_overlay_image_done(struct overlay *overlay)
@@ -103,6 +105,124 @@ static void task_overlay_load_desc_image(
input_overlay->pos ++;
}
+static void task_overlay_redefine_eightway_direction(
+ char *str, input_bits_t *data)
+{
+ char *tok, *save;
+ unsigned bit;
+
+ BIT256_CLEAR_ALL(*data);
+
+ for (tok = strtok_r(str, "|", &save); tok;
+ tok = strtok_r(NULL, "|", &save))
+ {
+ bit = input_config_translate_str_to_bind_id(tok);
+ if (bit < RARCH_CUSTOM_BIND_LIST_END)
+ BIT256_SET(*data, bit);
+ }
+}
+
+static void task_overlay_desc_populate_eightway_config(
+ overlay_loader_t *loader,
+ struct overlay_desc *desc,
+ unsigned ol_idx, unsigned desc_idx)
+{
+ input_driver_state_t *input_st = input_state_get_ptr();
+ overlay_eightway_config_t *eightway;
+ char conf_key[64];
+ char *str;
+
+ desc->eightway_config = (overlay_eightway_config_t *)
+ calloc(1, sizeof(overlay_eightway_config_t));
+ eightway = desc->eightway_config;
+
+ /* Populate default vals for the eightway type.
+ */
+ switch (desc->type)
+ {
+ case OVERLAY_TYPE_DPAD_AREA:
+ BIT256_SET(eightway->up, RETRO_DEVICE_ID_JOYPAD_UP);
+ BIT256_SET(eightway->down, RETRO_DEVICE_ID_JOYPAD_DOWN);
+ BIT256_SET(eightway->left, RETRO_DEVICE_ID_JOYPAD_LEFT);
+ BIT256_SET(eightway->right, RETRO_DEVICE_ID_JOYPAD_RIGHT);
+
+ eightway->slope_low = &input_st->overlay_eightway_dpad_slopes[0];
+ eightway->slope_high = &input_st->overlay_eightway_dpad_slopes[1];
+ break;
+
+ case OVERLAY_TYPE_ABXY_AREA:
+ BIT256_SET(eightway->up, RETRO_DEVICE_ID_JOYPAD_X);
+ BIT256_SET(eightway->down, RETRO_DEVICE_ID_JOYPAD_B);
+ BIT256_SET(eightway->left, RETRO_DEVICE_ID_JOYPAD_Y);
+ BIT256_SET(eightway->right, RETRO_DEVICE_ID_JOYPAD_A);
+
+ eightway->slope_low = &input_st->overlay_eightway_abxy_slopes[0];
+ eightway->slope_high = &input_st->overlay_eightway_abxy_slopes[1];
+ break;
+
+ default:
+ free(eightway);
+ desc->eightway_config = NULL;
+ return;
+ }
+
+ /* Redefine eightway vals if specified in conf
+ */
+ snprintf(conf_key, sizeof(conf_key),
+ "overlay%u_desc%u_up", ol_idx, desc_idx);
+ if (config_get_string(loader->conf, conf_key, &str))
+ {
+ task_overlay_redefine_eightway_direction(str, &eightway->up);
+ free(str);
+ }
+
+ snprintf(conf_key, sizeof(conf_key),
+ "overlay%u_desc%u_down", ol_idx, desc_idx);
+ if (config_get_string(loader->conf, conf_key, &str))
+ {
+ task_overlay_redefine_eightway_direction(str, &eightway->down);
+ free(str);
+ }
+
+ snprintf(conf_key, sizeof(conf_key),
+ "overlay%u_desc%u_right", ol_idx, desc_idx);
+ if (config_get_string(loader->conf, conf_key, &str))
+ {
+ task_overlay_redefine_eightway_direction(str, &eightway->right);
+ free(str);
+ }
+
+ snprintf(conf_key, sizeof(conf_key),
+ "overlay%u_desc%u_left", ol_idx, desc_idx);
+ if (config_get_string(loader->conf, conf_key, &str))
+ {
+ task_overlay_redefine_eightway_direction(str, &eightway->left);
+ free(str);
+ }
+
+ /* Prepopulate diagonals.
+ */
+ bits_or_bits(eightway->up_right.data, eightway->up.data,
+ CUSTOM_BINDS_U32_COUNT);
+ bits_or_bits(eightway->up_right.data, eightway->right.data,
+ CUSTOM_BINDS_U32_COUNT);
+
+ bits_or_bits(eightway->up_left.data, eightway->up.data,
+ CUSTOM_BINDS_U32_COUNT);
+ bits_or_bits(eightway->up_left.data, eightway->left.data,
+ CUSTOM_BINDS_U32_COUNT);
+
+ bits_or_bits(eightway->down_right.data, eightway->down.data,
+ CUSTOM_BINDS_U32_COUNT);
+ bits_or_bits(eightway->down_right.data, eightway->right.data,
+ CUSTOM_BINDS_U32_COUNT);
+
+ bits_or_bits(eightway->down_left.data, eightway->down.data,
+ CUSTOM_BINDS_U32_COUNT);
+ bits_or_bits(eightway->down_left.data, eightway->left.data,
+ CUSTOM_BINDS_U32_COUNT);
+}
+
static bool task_overlay_load_desc(
overlay_loader_t *loader,
struct overlay_desc *desc,
@@ -183,6 +303,10 @@ static bool task_overlay_load_desc(
desc->type = OVERLAY_TYPE_ANALOG_LEFT;
else if (string_is_equal(key, "analog_right"))
desc->type = OVERLAY_TYPE_ANALOG_RIGHT;
+ else if (string_is_equal(key, "dpad_area"))
+ desc->type = OVERLAY_TYPE_DPAD_AREA;
+ else if (string_is_equal(key, "abxy_area"))
+ desc->type = OVERLAY_TYPE_ABXY_AREA;
else if (strstr(key, "retrok_") == key)
{
desc->type = OVERLAY_TYPE_KEYBOARD;
@@ -212,6 +336,8 @@ static bool task_overlay_load_desc(
}
}
+ BIT16_SET(loader->overlay_types, desc->type);
+
width_mod = 1.0f;
height_mod = 1.0f;
@@ -263,6 +389,11 @@ static bool task_overlay_load_desc(
desc->analog_saturate_pct = 1.0f;
}
break;
+ case OVERLAY_TYPE_DPAD_AREA:
+ case OVERLAY_TYPE_ABXY_AREA:
+ task_overlay_desc_populate_eightway_config(
+ loader, desc, ol_idx, desc_idx);
+ break;
default:
/* OVERLAY_TYPE_BUTTONS - unhandled */
/* OVERLAY_TYPE_KEYBOARD - unhandled */
@@ -746,6 +877,7 @@ static void task_overlay_handler(retro_task_t *task)
data->overlay_enable = loader->overlay_enable;
data->hide_in_menu = loader->overlay_hide_in_menu;
data->hide_when_gamepad_connected = loader->overlay_hide_when_gamepad_connected;
+ data->overlay_types = loader->overlay_types;
memcpy(&data->layout_desc, &loader->layout_desc,
sizeof(overlay_layout_desc_t));