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