From 688c65267344ae34485a1e75c6202802f240d65f Mon Sep 17 00:00:00 2001 From: jdgleaver <38211560+jdgleaver@users.noreply.github.com> Date: Wed, 15 Dec 2021 18:01:39 +0000 Subject: [PATCH] [GameMode] Improve error handling (#13362) --- configuration.c | 9 ++++++++- frontend/drivers/platform_unix.c | 15 ++++++++++----- frontend/frontend_driver.c | 7 +++++++ frontend/frontend_driver.h | 2 ++ intl/msg_hash_us.h | 24 ++++++++++++++++-------- menu/menu_setting.c | 25 +++++++++++++++++++++++-- msg_hash.h | 2 ++ 7 files changed, 68 insertions(+), 16 deletions(-) diff --git a/configuration.c b/configuration.c index edda27f0bf..c63c5a24f5 100644 --- a/configuration.c +++ b/configuration.c @@ -3726,7 +3726,14 @@ static bool config_load_file(global_t *global, if (!config_entry_exists(conf, "user_language")) msg_hash_set_uint(MSG_HASH_USER_LANGUAGE, frontend_driver_get_user_language()); - frontend_driver_set_gamemode(settings->bools.gamemode_enable); + if (frontend_driver_has_gamemode() && + !frontend_driver_set_gamemode(settings->bools.gamemode_enable) && + settings->bools.gamemode_enable) + { + RARCH_WARN("[Config]: GameMode unsupported - disabling...\n"); + configuration_set_bool(settings, + settings->bools.gamemode_enable, false); + } /* If this is the first run of an existing installation * after the independent favourites playlist size limit was diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c index c70732e9c4..eddda212e2 100644 --- a/frontend/drivers/platform_unix.c +++ b/frontend/drivers/platform_unix.c @@ -1996,22 +1996,25 @@ static void android_app_destroy(struct android_app *android_app) static bool frontend_unix_set_gamemode(bool on) { #ifdef FERAL_GAMEMODE - const int gamemode_status = gamemode_query_status(); + int gamemode_status = gamemode_query_status(); + bool gamemode_active = (gamemode_status == 2); if (gamemode_status < 0) { if (on) - { RARCH_WARN("[GameMode]: GameMode cannot be enabled on this system (\"%s.\") " "https://github.com/FeralInteractive/gamemode needs to be installed.\n", gamemode_error_string()); - } + return false; } + if (gamemode_active == on) + return true; + if (on) { - if (gamemode_status != 2 && gamemode_request_start() != 0) + if (gamemode_request_start() != 0) { RARCH_WARN("[GameMode]: Failed to enter GameMode: %s.\n", gamemode_error_string()); return false; @@ -2019,15 +2022,17 @@ static bool frontend_unix_set_gamemode(bool on) } else { - if (gamemode_status == 2 && gamemode_request_end() != 0) + if (gamemode_request_end() != 0) { RARCH_WARN("[GameMode]: Failed to exit GameMode: %s.\n", gamemode_error_string()); return false; } } + return true; #else (void)on; + return false; #endif } diff --git a/frontend/frontend_driver.c b/frontend/frontend_driver.c index 4d1850dad3..6ee9576714 100644 --- a/frontend/frontend_driver.c +++ b/frontend/frontend_driver.c @@ -590,6 +590,13 @@ enum retro_language frontend_driver_get_user_language(void) return RETRO_LANGUAGE_ENGLISH; } +bool frontend_driver_has_gamemode(void) +{ + frontend_state_t *frontend_st = &frontend_driver_st; + frontend_ctx_driver_t *frontend = frontend_st->current_frontend_ctx; + return frontend && frontend->set_gamemode; +} + bool frontend_driver_set_gamemode(bool on) { frontend_state_t *frontend_st = &frontend_driver_st; diff --git a/frontend/frontend_driver.h b/frontend/frontend_driver.h index dd9a10fb5d..a7f1f15220 100644 --- a/frontend/frontend_driver.h +++ b/frontend/frontend_driver.h @@ -232,6 +232,8 @@ const char* frontend_driver_get_cpu_model_name(void); enum retro_language frontend_driver_get_user_language(void); +bool frontend_driver_has_gamemode(void); + bool frontend_driver_set_gamemode(bool on); frontend_state_t *frontend_state_get_ptr(void); diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index b181479676..2d1c7dec88 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -12329,6 +12329,22 @@ MSG_HASH( MSG_CORE_INFO_CACHE_UNSUPPORTED, "Cannot write to core info directory - core info cache will be disabled" ) +MSG_HASH( + MSG_FOUND_ENTRY_STATE_IN, + "Found entry state in" + ) +MSG_HASH( + MSG_LOADING_ENTRY_STATE_FROM, + "Loading entry state from" + ) +MSG_HASH( + MSG_FAILED_TO_ENTER_GAMEMODE, + "Failed to enter GameMode" + ) +MSG_HASH( + MSG_FAILED_TO_ENTER_GAMEMODE_LINUX, + "Failed to enter GameMode - ensure GameMode daemon is installed/running" + ) /* Lakka */ @@ -12907,11 +12923,3 @@ MSG_HASH( "Scan Finished.

\nIn order for content to be correctly scanned, you must:\n\nFinally, the content must match existing databases from here. If it is still not working, consider submitting a bug report." ) #endif -MSG_HASH( - MSG_FOUND_ENTRY_STATE_IN, - "Found entry state in" - ) -MSG_HASH( - MSG_LOADING_ENTRY_STATE_FROM, - "Loading entry state from" - ) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 6ba295024c..09e23208f0 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -7595,7 +7595,28 @@ static void general_write_handler(rarch_setting_t *setting) } break; case MENU_ENUM_LABEL_GAMEMODE_ENABLE: - frontend_driver_set_gamemode(config_get_ptr()->bools.gamemode_enable); + if (frontend_driver_has_gamemode()) + { + bool on = *setting->value.target.boolean; + + if (!frontend_driver_set_gamemode(on) && on) + { + settings_t *settings = config_get_ptr(); + + /* If we failed to enable game mode, display + * a notification and force disable the feature */ + runloop_msg_queue_push( +#ifdef __linux__ + msg_hash_to_str(MSG_FAILED_TO_ENTER_GAMEMODE_LINUX), +#else + msg_hash_to_str(MSG_FAILED_TO_ENTER_GAMEMODE), +#endif + 1, 180, true, + NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + configuration_set_bool(settings, + settings->bools.gamemode_enable, false); + } + } break; case MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR: core_set_poll_type(*setting->value.target.integer); @@ -17276,7 +17297,7 @@ static bool setting_append_list( #endif #endif - if (frontend_get_ptr()->set_gamemode) + if (frontend_driver_has_gamemode()) CONFIG_BOOL( list, list_info, &settings->bools.gamemode_enable, diff --git a/msg_hash.h b/msg_hash.h index d9661348cb..905883adea 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -501,6 +501,8 @@ enum msg_hash_enums MSG_CORE_INFO_CACHE_UNSUPPORTED, MSG_LOADING_ENTRY_STATE_FROM, MSG_FOUND_ENTRY_STATE_IN, + MSG_FAILED_TO_ENTER_GAMEMODE, + MSG_FAILED_TO_ENTER_GAMEMODE_LINUX, MENU_LABEL(MENU_XMB_ANIMATION_HORIZONTAL_HIGHLIGHT), MENU_LABEL(MENU_XMB_ANIMATION_MOVE_UP_DOWN),