Add option to load overlay based on system name (#17233)

This commit is contained in:
Eric Warmenhoven 2024-12-08 02:58:33 -05:00 committed by GitHub
parent 3b4d1aa0a4
commit 99c2676efa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 131 additions and 5 deletions

View File

@ -3679,6 +3679,10 @@ static bool config_load_file(global_t *global,
* variable. */
char tmp_append_path[PATH_MAX_LENGTH];
const char *extra_path = NULL;
#ifdef HAVE_OVERLAY
char old_overlay_path[PATH_MAX_LENGTH], new_overlay_path[PATH_MAX_LENGTH];
config_get_path(conf, "input_overlay", old_overlay_path, sizeof(old_overlay_path));
#endif
strlcpy(tmp_append_path, path_get(RARCH_PATH_CONFIG_OVERRIDE),
sizeof(tmp_append_path));
extra_path = strtok_r(tmp_append_path, "|", &save);
@ -3699,6 +3703,11 @@ static bool config_load_file(global_t *global,
/* Re-check verbosity settings */
check_verbosity_settings(conf, settings);
#ifdef HAVE_OVERLAY
config_get_path(conf, "input_overlay", new_overlay_path, sizeof(new_overlay_path));
if (!string_is_equal(old_overlay_path, new_overlay_path))
retroarch_override_setting_set(RARCH_OVERRIDE_SETTING_OVERLAY_PRESET, NULL);
#endif
}
#if 0

View File

@ -48,9 +48,11 @@
#include "../command.h"
#include "../config.def.keybinds.h"
#include "../configuration.h"
#include "../core_info.h"
#include "../driver.h"
#include "../frontend/frontend_driver.h"
#include "../list_special.h"
#include "../paths.h"
#include "../performance_counters.h"
#include "../retroarch.h"
#ifdef HAVE_BSV_MOVIE
@ -5235,6 +5237,103 @@ static void input_overlay_loaded(retro_task_t *task,
#endif
}
static const char *input_overlay_path(bool want_osk)
{
static char system_overlay_path[PATH_MAX_LENGTH] = {0};
char overlay_directory[PATH_MAX_LENGTH];
settings_t *settings = config_get_ptr();
playlist_t *playlist = playlist_get_cached();
core_info_t *core_info = NULL;
const char *content_path = path_get(RARCH_PATH_CONTENT);
if (want_osk)
return settings->paths.path_osk_overlay;
/* if the option is set to turn this off, just return default */
if (!settings->bools.input_overlay_enable_autopreferred)
return settings->paths.path_overlay;
/* if there's an override, use it */
if (retroarch_override_setting_is_set(RARCH_OVERRIDE_SETTING_OVERLAY_PRESET, NULL))
return settings->paths.path_overlay;
/* let's go hunting */
fill_pathname_expand_special(overlay_directory,
settings->paths.directory_overlay,
sizeof(overlay_directory));
#define SYSTEM_OVERLAY_DIR "gamepads/Named_Overlays"
/* try based on the playlist entry first */
if (playlist)
{
#ifdef HAVE_MENU
menu_handle_t *menu = menu_state_get_ptr()->driver_data;
if (menu)
{
const char *playlist_db_name = NULL;
playlist_get_db_name(playlist, menu->rpl_entry_selection_ptr, &playlist_db_name);
if (playlist_db_name)
{
fill_pathname_join_special_ext(system_overlay_path,
overlay_directory, SYSTEM_OVERLAY_DIR, playlist_db_name, "",
sizeof(system_overlay_path));
strlcpy(path_get_extension_mutable(system_overlay_path), ".cfg", 5);
if (path_is_valid(system_overlay_path))
return system_overlay_path;
}
}
#endif
if (!string_is_empty(content_path))
{
const struct playlist_entry *entry;
playlist_get_index_by_path(playlist, content_path, &entry);
if (entry && entry->db_name)
{
fill_pathname_join_special_ext(system_overlay_path,
overlay_directory, SYSTEM_OVERLAY_DIR, entry->db_name, "",
sizeof(system_overlay_path));
strlcpy(path_get_extension_mutable(system_overlay_path), ".cfg", 5);
if (path_is_valid(system_overlay_path))
return system_overlay_path;
}
}
}
/* maybe the core info will have some clues */
core_info_get_current_core(&core_info);
if (core_info)
{
if (core_info->databases_list && core_info->databases_list->size == 1)
{
fill_pathname_join_special_ext(system_overlay_path,
overlay_directory, SYSTEM_OVERLAY_DIR, core_info->databases_list->elems[0].data, ".cfg",
sizeof(system_overlay_path));
if (path_is_valid(system_overlay_path))
return system_overlay_path;
}
fill_pathname_join_special_ext(system_overlay_path,
overlay_directory, SYSTEM_OVERLAY_DIR, core_info->display_name, ".cfg",
sizeof(system_overlay_path));
if (path_is_valid(system_overlay_path))
return system_overlay_path;
}
/* maybe based on the content's directory name */
if (!string_is_empty(content_path))
{
char dirname[PATH_MAX_LENGTH];
fill_pathname_parent_dir_name(dirname, content_path, sizeof(dirname));
fill_pathname_join_special_ext(system_overlay_path,
overlay_directory, SYSTEM_OVERLAY_DIR, dirname, ".cfg",
sizeof(system_overlay_path));
if (path_is_valid(system_overlay_path))
return system_overlay_path;
}
/* I give up */
return settings->paths.path_overlay;
}
void input_overlay_init(void)
{
settings_t *settings = config_get_ptr();
@ -5244,9 +5343,7 @@ void input_overlay_init(void)
bool want_osk =
(input_st->flags & INP_FLAG_KB_LINEFEED_ENABLE)
&& !string_is_empty(settings->paths.path_osk_overlay);
const char *path_overlay = want_osk
? settings->paths.path_osk_overlay
: settings->paths.path_overlay;
const char *path_overlay = input_overlay_path(want_osk);
bool want_hidden = input_overlay_want_hidden();
bool overlay_shown = ol
&& (ol->flags & INPUT_OVERLAY_ENABLE)

View File

@ -5426,6 +5426,10 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_OVERLAY_AUTOLOAD_PREFERRED,
"Autoload Preferred Overlay"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_OVERLAY_AUTOLOAD_PREFERRED,
"Prefer loading overlays based on system name before falling back to the default preset. Will be ignored if an override is set for the overlay preset."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_OVERLAY_OPACITY,
"Overlay Opacity"

View File

@ -2438,6 +2438,7 @@ static int generic_action_ok(const char *path,
break;
case ACTION_OK_SET_PATH_OVERLAY:
flush_char = msg_hash_to_str(MENU_ENUM_LABEL_DEFERRED_ONSCREEN_OVERLAY_SETTINGS_LIST);
retroarch_override_setting_set(RARCH_OVERRIDE_SETTING_OVERLAY_PRESET, NULL);
ret = set_path_generic(menu_label, action_path);
break;
case ACTION_OK_SET_PATH_OSK_OVERLAY:

View File

@ -883,6 +883,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_y_separation_portrait, MEN
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_x_offset_portrait, MENU_ENUM_SUBLABEL_OVERLAY_X_OFFSET_PORTRAIT)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_y_offset_portrait, MENU_ENUM_SUBLABEL_OVERLAY_Y_OFFSET_PORTRAIT)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_enable, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ENABLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_autoload_preferred, MENU_ENUM_SUBLABEL_OVERLAY_AUTOLOAD_PREFERRED)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_preset, MENU_ENUM_SUBLABEL_OVERLAY_PRESET)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_osk_overlay_preset, MENU_ENUM_SUBLABEL_OSK_OVERLAY_PRESET)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_overlay_pointer_enable, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_POINTER_ENABLE)
@ -3744,6 +3745,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_NETPLAY_IP_ADDRESS:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_netplay_ip_address);
break;
case MENU_ENUM_LABEL_OVERLAY_AUTOLOAD_PREFERRED:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_overlay_autoload_preferred);
break;
case MENU_ENUM_LABEL_OVERLAY_PRESET:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_overlay_preset);
break;

View File

@ -10112,6 +10112,7 @@ unsigned menu_displaylist_build_list(
menu_displaylist_build_info_selective_t build_list[] = {
{MENU_ENUM_LABEL_INPUT_OVERLAY_ENABLE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_OVERLAY_AUTOLOAD_PREFERRED, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_OVERLAY_PRESET, PARSE_ONLY_PATH, false },
{MENU_ENUM_LABEL_OVERLAY_OPACITY, PARSE_ONLY_FLOAT, false },
{MENU_ENUM_LABEL_INPUT_OVERLAY_BEHIND_MENU, PARSE_ONLY_BOOL, false },

View File

@ -310,7 +310,7 @@ struct rarch_state
sthread_tls_t rarch_tls; /* unsigned alignment */
#endif
unsigned perf_ptr_rarch;
uint16_t flags;
uint32_t flags;
char launch_arguments[4096];
char path_default_shader_preset[PATH_MAX_LENGTH];
@ -5555,6 +5555,9 @@ void retroarch_override_setting_set(
case RARCH_OVERRIDE_SETTING_DATABASE_SCAN:
p_rarch->flags |= RARCH_FLAGS_CLI_DATABASE_SCAN;
break;
case RARCH_OVERRIDE_SETTING_OVERLAY_PRESET:
p_rarch->flags |= RARCH_FLAGS_HAS_SET_OVERLAY_PRESET;
break;
case RARCH_OVERRIDE_SETTING_NONE:
default:
break;
@ -5637,6 +5640,9 @@ void retroarch_override_setting_unset(
case RARCH_OVERRIDE_SETTING_DATABASE_SCAN:
p_rarch->flags &= ~RARCH_FLAGS_CLI_DATABASE_SCAN;
break;
case RARCH_OVERRIDE_SETTING_OVERLAY_PRESET:
p_rarch->flags &= ~RARCH_FLAGS_HAS_SET_OVERLAY_PRESET;
break;
case RARCH_OVERRIDE_SETTING_NONE:
default:
break;
@ -8112,6 +8118,8 @@ bool retroarch_override_setting_is_set(
return ((p_rarch->flags & RARCH_FLAGS_HAS_SET_LOG_TO_FILE) > 0);
case RARCH_OVERRIDE_SETTING_DATABASE_SCAN:
return ((p_rarch->flags & RARCH_FLAGS_CLI_DATABASE_SCAN) > 0);
case RARCH_OVERRIDE_SETTING_OVERLAY_PRESET:
return ((p_rarch->flags & RARCH_FLAGS_HAS_SET_OVERLAY_PRESET) > 0);
case RARCH_OVERRIDE_SETTING_NONE:
default:
break;

View File

@ -106,7 +106,8 @@ enum rarch_state_flags
RARCH_FLAGS_BLOCK_CONFIG_READ = (1 << 13),
RARCH_FLAGS_CLI_DATABASE_SCAN = (1 << 14),
RARCH_FLAGS_HAS_SET_XDELTA_PREF = (1 << 15),
RARCH_FLAGS_XDELTA_PREF = (1 << 16)
RARCH_FLAGS_XDELTA_PREF = (1 << 16),
RARCH_FLAGS_HAS_SET_OVERLAY_PRESET = (1 << 17)
};
bool retroarch_ctl(enum rarch_ctl_state state, void *data);

View File

@ -128,6 +128,7 @@ enum rarch_override_setting
RARCH_OVERRIDE_SETTING_LIBRETRO_DEVICE,
RARCH_OVERRIDE_SETTING_LOG_TO_FILE,
RARCH_OVERRIDE_SETTING_DATABASE_SCAN,
RARCH_OVERRIDE_SETTING_OVERLAY_PRESET,
RARCH_OVERRIDE_SETTING_LAST
};