(steam) Introduce Steam Rich Presence (#13798)

This commit is contained in:
Mats 2022-04-02 09:07:40 +02:00 committed by GitHub
parent fccef557fc
commit 4a1a1e2fa7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 604 additions and 120 deletions

View File

@ -2226,6 +2226,7 @@ ifeq ($(HAVE_NETWORKING), 1)
ifeq ($(HAVE_DISCORD), 1)
NEED_CXX_LINKER = 1
HAVE_PRESENCE = 1
DEFINES += -DHAVE_DISCORD
INCLUDE_DIRS += -Ideps/discord-rpc/include
@ -2463,11 +2464,20 @@ endif
### Steam integration using mist
ifeq ($(HAVE_MIST), 1)
HAVE_PRESENCE = 1
DEFINES += -DHAVE_MIST
INCLUDE_DIRS += -I$(MIST_PATH)/include
LDFLAGS += -L$(MIST_PATH) -lmist
OBJ += steam/steam.o tasks/task_steam.o
endif
### Shared rich presence code for Discord and Steam
ifeq ($(HAVE_PRESENCE), 1)
DEFINES += -DHAVE_PRESENCE
OBJ += network/presence.o
endif
##################################
### Classic Platform specifics ###
###############WIP################

View File

@ -32,8 +32,8 @@
#include "../network/net_http_special.h"
#include "../tasks/tasks_internal.h"
#ifdef HAVE_DISCORD
#include "../network/discord.h"
#ifdef HAVE_PRESENCE
#include "../network/presence.h"
#endif
#include "../deps/rcheevos/include/rc_api_runtime.h"
@ -1268,9 +1268,8 @@ static retro_time_t rcheevos_client_prepare_ping(
rcheevos_log_post_url(request->request.url,
request->request.post_data);
#ifdef HAVE_DISCORD
if (settings->bools.discord_enable && discord_is_ready())
discord_update(DISCORD_PRESENCE_RETROACHIEVEMENTS);
#ifdef HAVE_PRESENCE
presence_update(PRESENCE_RETROACHIEVEMENTS);
#endif
/* Update rich presence every two minutes */

View File

@ -244,7 +244,7 @@ enum event_command
CMD_EVENT_MIXER_VOLUME_UP,
CMD_EVENT_MIXER_VOLUME_DOWN,
CMD_EVENT_DISCORD_INIT,
CMD_EVENT_DISCORD_UPDATE,
CMD_EVENT_PRESENCE_UPDATE,
CMD_EVENT_OSK_TOGGLE,
CMD_EVENT_RECORDING_TOGGLE,
CMD_EVENT_STREAMING_TOGGLE,

View File

@ -53,6 +53,11 @@
#include "../input/input_overlay.h"
#endif
/* Required for Steam enum settings */
#if defined(HAVE_MIST)
#include "steam/steam.h"
#endif
#if defined(HW_RVL)
#define MAX_GAMMA_SETTING 30
#elif defined(GEKKO)
@ -605,6 +610,8 @@
#define DEFAULT_SETTINGS_SHOW_DIRECTORY true
#define DEFAULT_SETTINGS_SHOW_STEAM true
#define DEFAULT_QUICK_MENU_SHOW_RESUME_CONTENT true
#define DEFAULT_QUICK_MENU_SHOW_RESTART_CONTENT true
@ -1518,6 +1525,11 @@ static const enum resampler_quality audio_resampler_quality_level = RESAMPLER_QU
static const unsigned midi_volume = 100;
#ifdef HAVE_MIST
/* Steam */
#define DEFAULT_STEAM_RICH_PRESENCE_FORMAT STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM
#endif
/* Only applies to Android 7.0 (API 24) and up */
static const bool sustained_performance_mode = false;

View File

@ -1752,6 +1752,9 @@ static struct config_bool_setting *populate_settings_bool(
#ifdef HAVE_THREADS
SETTING_BOOL("threaded_data_runloop_enable", &settings->bools.threaded_data_runloop_enable, true, DEFAULT_THREADED_DATA_RUNLOOP_ENABLE, false);
#endif
#ifdef HAVE_MIST
SETTING_BOOL("steam_rich_presence_enable", &settings->bools.steam_rich_presence_enable, true, false, false);
#endif
#ifdef HAVE_MENU
SETTING_BOOL("menu_unified_controls", &settings->bools.menu_unified_controls, true, false, false);
SETTING_BOOL("menu_throttle_framerate", &settings->bools.menu_throttle_framerate, true, true, false);
@ -1792,6 +1795,9 @@ static struct config_bool_setting *populate_settings_bool(
SETTING_BOOL("settings_show_playlists", &settings->bools.settings_show_playlists, true, DEFAULT_SETTINGS_SHOW_PLAYLISTS, false);
SETTING_BOOL("settings_show_user", &settings->bools.settings_show_user, true, DEFAULT_SETTINGS_SHOW_USER, false);
SETTING_BOOL("settings_show_directory", &settings->bools.settings_show_directory, true, DEFAULT_SETTINGS_SHOW_DIRECTORY, false);
#ifdef HAVE_MIST
SETTING_BOOL("settings_show_steam", &settings->bools.settings_show_steam, true, DEFAULT_SETTINGS_SHOW_STEAM, false);
#endif
SETTING_BOOL("quick_menu_show_resume_content", &settings->bools.quick_menu_show_resume_content, true, DEFAULT_QUICK_MENU_SHOW_RESUME_CONTENT, false);
SETTING_BOOL("quick_menu_show_restart_content", &settings->bools.quick_menu_show_restart_content, true, DEFAULT_QUICK_MENU_SHOW_RESTART_CONTENT, false);
@ -2331,6 +2337,10 @@ static struct config_uint_setting *populate_settings_uint(
SETTING_UINT("cpu_max_freq", &settings->uints.cpu_max_freq, true, ~0U, false);
#endif
#ifdef HAVE_MIST
SETTING_UINT("steam_rich_presence_format", &settings->uints.steam_rich_presence_format, true, DEFAULT_STEAM_RICH_PRESENCE_FORMAT, false);
#endif
*size = count;
return tmp;

View File

@ -339,6 +339,10 @@ typedef struct settings
unsigned cpu_min_freq;
unsigned cpu_max_freq;
#endif
#ifdef HAVE_MIST
unsigned steam_rich_presence_format;
#endif
} uints;
struct
@ -740,6 +744,9 @@ typedef struct settings
bool settings_show_playlists;
bool settings_show_user;
bool settings_show_directory;
#ifdef HAVE_MIST
bool settings_show_steam;
#endif
bool quick_menu_show_resume_content;
bool quick_menu_show_restart_content;
bool quick_menu_show_close_content;
@ -832,6 +839,11 @@ typedef struct settings
/* Driver */
bool driver_switch_enable;
#ifdef HAVE_MIST
/* Steam */
bool steam_rich_presence_enable;
#endif
/* Misc. */
bool discord_enable;
bool threaded_data_runloop_enable;

View File

@ -629,6 +629,18 @@ MSG_HASH(
MENU_ENUM_LABEL_CORE_STEAM_UNINSTALL,
"core_steam_uninstall"
)
MSG_HASH(
MENU_ENUM_LABEL_STEAM_SETTINGS,
"steam_settings"
)
MSG_HASH(
MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_ENABLE,
"steam_rich_presence_enable"
)
MSG_HASH(
MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_FORMAT,
"steam_rich_presence_format"
)
#endif
MSG_HASH(
MENU_ENUM_LABEL_CPU_ARCHITECTURE,
@ -909,6 +921,10 @@ MSG_HASH(
"deferred_core_manager_list"
)
#ifdef HAVE_MIST
MSG_HASH(
MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST,
"deferred_steam_settings_list"
)
MSG_HASH(
MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST,
"deferred_core_manager_steam_list"
@ -5206,6 +5222,12 @@ MSG_HASH(
MENU_ENUM_LABEL_SETTINGS_SHOW_DIRECTORY,
"settings_show_directory"
)
#ifdef HAVE_MIST
MSG_HASH(
MENU_ENUM_LABEL_SETTINGS_SHOW_STEAM,
"settings_show_steam"
)
#endif
MSG_HASH(
MENU_ENUM_LABEL_FRAME_TIME_COUNTER_RESET_AFTER_FASTFORWARDING,
"frame_time_counter_reset_after_fastforwarding"

View File

@ -1289,6 +1289,17 @@ MSG_HASH(
"Change default directories where files are located."
)
#ifdef HAVE_MIST
MSG_HASH(
MENU_ENUM_LABEL_VALUE_STEAM_SETTINGS,
"Steam"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_STEAM_SETTINGS,
"Change settings related to Steam."
)
#endif
/* Settings > Drivers */
MSG_HASH(
@ -5249,6 +5260,15 @@ MSG_HASH(
"Show 'Directory' settings."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_STEAM,
"Show 'Steam'"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_SETTINGS_SHOW_STEAM,
"Show 'Steam' settings."
)
/* Settings > User Interface > Appearance */
MSG_HASH(
@ -6371,6 +6391,53 @@ MSG_HASH(
"System event logs are stored in this directory."
)
#ifdef HAVE_MIST
/* Settings > Steam */
MSG_HASH(
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_ENABLE,
"Enable Rich Presence"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_STEAM_RICH_PRESENCE_ENABLE,
"Share your current status within RetroArch on Steam."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT,
"Rich Presence Content Format"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_STEAM_RICH_PRESENCE_FORMAT,
"Decide what information related to the running content will be shared."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT,
"Content"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CORE,
"Core name"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_SYSTEM,
"System name"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM,
"Content (System name)"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE,
"Content (Core name)"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE,
"Content (System name - Core name)"
)
#endif
/* Music */
/* Music > Quick Menu */

View File

@ -273,6 +273,7 @@ GENERIC_DEFERRED_PUSH(deferred_push_core_delete_backup_list, DISPLAYLIST_
GENERIC_DEFERRED_PUSH(deferred_push_core_manager_list, DISPLAYLIST_CORE_MANAGER_LIST)
#ifdef HAVE_MIST
GENERIC_DEFERRED_PUSH(deferred_push_steam_settings_list, DISPLAYLIST_STEAM_SETTINGS_LIST)
GENERIC_DEFERRED_PUSH(deferred_push_core_manager_steam_list, DISPLAYLIST_CORE_MANAGER_STEAM_LIST)
GENERIC_DEFERRED_PUSH(deferred_push_core_information_steam_list, DISPLAYLIST_CORE_INFORMATION_STEAM_LIST)
#endif
@ -888,6 +889,7 @@ static int menu_cbs_init_bind_deferred_push_compare_label(
{MENU_ENUM_LABEL_DEFERRED_CORE_DELETE_BACKUP_LIST, deferred_push_core_delete_backup_list},
{MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_LIST, deferred_push_core_manager_list},
#ifdef HAVE_MIST
{MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST, deferred_push_steam_settings_list},
{MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST, deferred_push_core_manager_steam_list},
{MENU_ENUM_LABEL_DEFERRED_CORE_INFORMATION_STEAM_LIST, deferred_push_core_information_steam_list},
#endif
@ -1322,6 +1324,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label(
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_manager_list);
break;
#ifdef HAVE_MIST
case MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST:
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_steam_settings_list);
break;
case MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST:
BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_core_manager_steam_list);
break;

View File

@ -489,6 +489,8 @@ static enum msg_hash_enums action_ok_dl_to_enum(unsigned lbl)
case ACTION_OK_DL_CORE_MANAGER_LIST:
return MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_LIST;
#ifdef HAVE_MIST
case ACTION_OK_DL_STEAM_SETTINGS_LIST:
return MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST;
case ACTION_OK_DL_CORE_MANAGER_STEAM_LIST:
return MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST;
#endif
@ -1583,6 +1585,7 @@ int generic_action_ok_displaylist_push(const char *path,
case ACTION_OK_DL_MANUAL_CONTENT_SCAN_LIST:
case ACTION_OK_DL_CORE_MANAGER_LIST:
#ifdef HAVE_MIST
case ACTION_OK_DL_STEAM_SETTINGS_LIST:
case ACTION_OK_DL_CORE_MANAGER_STEAM_LIST:
#endif
case ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST:
@ -5829,6 +5832,7 @@ DEFAULT_ACTION_OK_FUNC(action_ok_push_manual_content_scan_list, ACTION_OK_DL_MAN
DEFAULT_ACTION_OK_FUNC(action_ok_manual_content_scan_dat_file, ACTION_OK_DL_MANUAL_CONTENT_SCAN_DAT_FILE)
DEFAULT_ACTION_OK_FUNC(action_ok_push_core_manager_list, ACTION_OK_DL_CORE_MANAGER_LIST)
#ifdef HAVE_MIST
DEFAULT_ACTION_OK_FUNC(action_ok_steam_settings_list, ACTION_OK_DL_STEAM_SETTINGS_LIST)
DEFAULT_ACTION_OK_FUNC(action_ok_push_core_manager_steam_list, ACTION_OK_DL_CORE_MANAGER_STEAM_LIST)
#endif
DEFAULT_ACTION_OK_FUNC(action_ok_push_core_option_override_list, ACTION_OK_DL_CORE_OPTION_OVERRIDE_LIST)
@ -8262,6 +8266,7 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs,
{MENU_ENUM_LABEL_PLAYLIST_MANAGER_DEFAULT_CORE, action_ok_playlist_default_core},
{MENU_ENUM_LABEL_CORE_MANAGER_LIST, action_ok_push_core_manager_list},
#ifdef HAVE_MIST
{MENU_ENUM_LABEL_STEAM_SETTINGS, action_ok_steam_settings_list},
{MENU_ENUM_LABEL_CORE_MANAGER_STEAM_LIST, action_ok_push_core_manager_steam_list},
{MENU_ENUM_LABEL_CORE_STEAM_INSTALL, action_ok_core_steam_install},
{MENU_ENUM_LABEL_CORE_STEAM_UNINSTALL, action_ok_core_steam_uninstall},

View File

@ -532,6 +532,9 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_switch_installed_cores_pfd, MENU_
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_sideload_core_list, MENU_ENUM_SUBLABEL_SIDELOAD_CORE_LIST)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_manager_list, MENU_ENUM_SUBLABEL_CORE_MANAGER_LIST)
#ifdef HAVE_MIST
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_steam_settings_list, MENU_ENUM_SUBLABEL_STEAM_SETTINGS)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_steam_rich_presence_enable, MENU_ENUM_SUBLABEL_STEAM_RICH_PRESENCE_ENABLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_steam_rich_presence_format, MENU_ENUM_SUBLABEL_STEAM_RICH_PRESENCE_FORMAT)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_core_manager_steam_list, MENU_ENUM_SUBLABEL_CORE_MANAGER_STEAM_LIST)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_menu_show_core_manager_steam, MENU_ENUM_SUBLABEL_MENU_SHOW_CORE_MANAGER_STEAM)
#endif
@ -914,6 +917,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_settings_show_network,
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_settings_show_playlists, MENU_ENUM_SUBLABEL_SETTINGS_SHOW_PLAYLISTS)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_settings_show_user, MENU_ENUM_SUBLABEL_SETTINGS_SHOW_USER)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_settings_show_directory, MENU_ENUM_SUBLABEL_SETTINGS_SHOW_DIRECTORY)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_settings_show_steam, MENU_ENUM_SUBLABEL_SETTINGS_SHOW_STEAM)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_take_screenshot, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_resume_content, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESUME_CONTENT)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_quick_menu_show_restart_content, MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESTART_CONTENT)
@ -2543,6 +2547,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_SETTINGS_SHOW_DIRECTORY:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_settings_show_directory);
break;
case MENU_ENUM_LABEL_SETTINGS_SHOW_STEAM:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_settings_show_steam);
break;
case MENU_ENUM_LABEL_QUICK_MENU_SHOW_RESUME_CONTENT:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_quick_menu_show_resume_content);
break;
@ -3776,6 +3783,15 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_manager_list);
break;
#ifdef HAVE_MIST
case MENU_ENUM_LABEL_STEAM_SETTINGS:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_steam_settings_list);
break;
case MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_ENABLE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_steam_rich_presence_enable);
break;
case MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_FORMAT:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_steam_rich_presence_format);
break;
case MENU_ENUM_LABEL_CORE_MANAGER_STEAM_LIST:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_manager_steam_list);
break;

View File

@ -770,6 +770,7 @@ DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_title_deferred_contentless_cores_li
DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_core_updater_list, MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST)
DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_core_manager_list, MENU_ENUM_LABEL_VALUE_CORE_MANAGER_LIST)
#ifdef HAVE_MIST
DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_steam_settings_list, MENU_ENUM_LABEL_VALUE_STEAM_SETTINGS)
DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_core_manager_steam_list, MENU_ENUM_LABEL_VALUE_CORE_MANAGER_STEAM_LIST)
#endif
DEFAULT_TITLE_SEARCH_FILTER_MACRO(action_get_core_cheat_options_list, MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS)
@ -1160,6 +1161,8 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs,
{MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_LIST,
action_get_core_manager_list},
#ifdef HAVE_MIST
{MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST,
action_get_steam_settings_list},
{MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST,
action_get_core_manager_steam_list},
#endif
@ -1487,6 +1490,9 @@ static int menu_cbs_init_bind_title_compare_label(menu_file_list_cbs_t *cbs,
BIND_ACTION_GET_TITLE(cbs, action_get_core_manager_list);
break;
#ifdef HAVE_MIST
case MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST:
BIND_ACTION_GET_TITLE(cbs, action_get_steam_settings_list);
break;
case MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST:
BIND_ACTION_GET_TITLE(cbs, action_get_core_manager_steam_list);
break;

View File

@ -155,6 +155,7 @@ enum
ACTION_OK_DL_CORE_UPDATER_LIST,
ACTION_OK_DL_CORE_MANAGER_LIST,
#ifdef HAVE_MIST
ACTION_OK_DL_STEAM_SETTINGS_LIST,
ACTION_OK_DL_CORE_MANAGER_STEAM_LIST,
#endif
ACTION_OK_DL_THUMBNAILS_UPDATER_LIST,

View File

@ -9309,6 +9309,40 @@ unsigned menu_displaylist_build_list(
}
}
break;
#ifdef HAVE_MIST
case DISPLAYLIST_STEAM_SETTINGS_LIST:
{
menu_displaylist_build_info_selective_t build_list[] = {
{MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_ENABLE, PARSE_ONLY_BOOL, true},
{MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_FORMAT, PARSE_ONLY_UINT, false},
};
for (i = 0; i < ARRAY_SIZE(build_list); i++)
{
switch (build_list[i].enum_idx)
{
case MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_FORMAT:
if (settings->bools.steam_rich_presence_enable)
build_list[i].checked = true;
break;
default:
break;
}
}
for (i = 0; i < ARRAY_SIZE(build_list); i++)
{
if (!build_list[i].checked)
continue;
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
build_list[i].enum_idx, build_list[i].parse_type,
false) == 0)
count++;
}
}
break;
#endif
case DISPLAYLIST_SETTINGS_ALL:
{
#ifdef HAVE_TRANSLATE
@ -9345,6 +9379,9 @@ unsigned menu_displaylist_build_list(
{MENU_ENUM_LABEL_PLAYLIST_SETTINGS, PARSE_ACTION, true},
{MENU_ENUM_LABEL_USER_SETTINGS, PARSE_ACTION, true},
{MENU_ENUM_LABEL_DIRECTORY_SETTINGS, PARSE_ACTION, true},
#ifdef HAVE_MIST
{MENU_ENUM_LABEL_STEAM_SETTINGS, PARSE_ACTION, true},
#endif
};
@ -9422,6 +9459,11 @@ unsigned menu_displaylist_build_list(
case MENU_ENUM_LABEL_DIRECTORY_SETTINGS:
build_list[i].checked = settings->bools.settings_show_directory;
break;
#ifdef HAVE_MIST
case MENU_ENUM_LABEL_STEAM_SETTINGS:
build_list[i].checked = settings->bools.settings_show_steam;
break;
#endif
/* MISSING:
* MENU_ENUM_LABEL_BLUETOOTH_SETTINGS
* MENU_ENUM_LABEL_WIFI_SETTINGS
@ -9574,6 +9616,9 @@ unsigned menu_displaylist_build_list(
{MENU_ENUM_LABEL_SETTINGS_SHOW_PLAYLISTS, PARSE_ONLY_BOOL},
{MENU_ENUM_LABEL_SETTINGS_SHOW_USER, PARSE_ONLY_BOOL},
{MENU_ENUM_LABEL_SETTINGS_SHOW_DIRECTORY, PARSE_ONLY_BOOL},
#ifdef HAVE_MIST
{MENU_ENUM_LABEL_SETTINGS_SHOW_STEAM, PARSE_ONLY_BOOL},
#endif
};
for (i = 0; i < ARRAY_SIZE(build_list); i++)
@ -12580,6 +12625,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type,
case DISPLAYLIST_INPUT_HAPTIC_FEEDBACK_SETTINGS_LIST:
case DISPLAYLIST_PLAYLIST_SETTINGS_LIST:
case DISPLAYLIST_SUBSYSTEM_SETTINGS_LIST:
#ifdef HAVE_MIST
case DISPLAYLIST_STEAM_SETTINGS_LIST:
#endif
menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list);
count = menu_displaylist_build_list(info->list, settings, type, false);

View File

@ -104,6 +104,7 @@ enum menu_displaylist_ctl_state
DISPLAYLIST_CORES_UPDATER,
DISPLAYLIST_CORE_MANAGER_LIST,
#ifdef HAVE_MIST
DISPLAYLIST_STEAM_SETTINGS_LIST,
DISPLAYLIST_CORE_MANAGER_STEAM_LIST,
DISPLAYLIST_CORE_INFORMATION_STEAM_LIST,
#endif

View File

@ -309,6 +309,9 @@ enum settings_list_type
SETTINGS_LIST_DIRECTORY,
SETTINGS_LIST_PRIVACY,
SETTINGS_LIST_MIDI,
#ifdef HAVE_MIST
SETTINGS_LIST_STEAM,
#endif
SETTINGS_LIST_MANUAL_CONTENT_SCAN
};
@ -6860,6 +6863,42 @@ static void setting_get_string_representation_uint_menu_screensaver_animation(
}
#endif
#ifdef HAVE_MIST
static void setting_get_string_representation_steam_rich_presence_format(
rarch_setting_t *setting,
char *s, size_t len)
{
if (!setting)
return;
switch (*setting->value.target.unsigned_integer)
{
case STEAM_RICH_PRESENCE_FORMAT_CONTENT:
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT), len);
break;
case STEAM_RICH_PRESENCE_FORMAT_CORE:
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CORE), len);
break;
case STEAM_RICH_PRESENCE_FORMAT_SYSTEM:
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_SYSTEM), len);
break;
case STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM:
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM), len);
break;
case STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE:
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE), len);
break;
case STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE:
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE), len);
break;
case STEAM_RICH_PRESENCE_FORMAT_NONE:
default:
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NONE), len);
break;
}
}
#endif
enum setting_type menu_setting_get_browser_selection_type(rarch_setting_t *setting)
{
if (!setting)
@ -9888,6 +9927,16 @@ static bool setting_append_list(
&subgroup_info,
parent_group);
#ifdef HAVE_MIST
CONFIG_ACTION(
list, list_info,
MENU_ENUM_LABEL_STEAM_SETTINGS,
MENU_ENUM_LABEL_VALUE_STEAM_SETTINGS,
&group_info,
&subgroup_info,
parent_group);
#endif
if (string_is_not_equal(settings->arrays.midi_driver, "null"))
{
CONFIG_ACTION(
@ -18341,6 +18390,23 @@ static bool setting_append_list(
general_read_handler,
SD_FLAG_NONE);
#ifdef HAVE_MIST
CONFIG_BOOL(
list, list_info,
&settings->bools.settings_show_steam,
MENU_ENUM_LABEL_SETTINGS_SHOW_STEAM,
MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_STEAM,
DEFAULT_SETTINGS_SHOW_STEAM,
MENU_ENUM_LABEL_VALUE_OFF,
MENU_ENUM_LABEL_VALUE_ON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_NONE);
#endif
CONFIG_BOOL(
list, list_info,
&settings->bools.quick_menu_show_take_screenshot,
@ -21120,6 +21186,55 @@ static bool setting_append_list(
END_SUB_GROUP(list, list_info, parent_group);
END_GROUP(list, list_info, parent_group);
break;
#ifdef HAVE_MIST
case SETTINGS_LIST_STEAM:
START_GROUP(list, list_info, &group_info,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_SETTINGS), parent_group);
parent_group = msg_hash_to_str(MENU_ENUM_LABEL_VALUE_STEAM_SETTINGS);
START_SUB_GROUP(list, list_info, "State",
&group_info, &subgroup_info, parent_group);
CONFIG_BOOL(
list, list_info,
&settings->bools.steam_rich_presence_enable,
MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_ENABLE,
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_ENABLE,
false,
MENU_ENUM_LABEL_VALUE_OFF,
MENU_ENUM_LABEL_VALUE_ON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_NONE);
(*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
(*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
(*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
CONFIG_UINT(
list, list_info,
&settings->uints.steam_rich_presence_format,
MENU_ENUM_LABEL_STEAM_RICH_PRESENCE_FORMAT,
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT,
DEFAULT_STEAM_RICH_PRESENCE_FORMAT,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler);
(*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
(*list)[list_info->index - 1].get_string_representation =
&setting_get_string_representation_steam_rich_presence_format;
menu_settings_list_current_add_range(list, list_info, 0, (STEAM_RICH_PRESENCE_FORMAT_LAST-1), 1, true, true);
END_SUB_GROUP(list, list_info, parent_group);
END_GROUP(list, list_info, parent_group);
break;
#endif
case SETTINGS_LIST_NONE:
default:
break;
@ -21268,6 +21383,9 @@ static rarch_setting_t *menu_setting_new_internal(rarch_setting_info_t *list_inf
SETTINGS_LIST_DIRECTORY,
SETTINGS_LIST_PRIVACY,
SETTINGS_LIST_MIDI,
#ifdef HAVE_MIST
SETTINGS_LIST_STEAM,
#endif
SETTINGS_LIST_MANUAL_CONTENT_SCAN
};
settings_t *settings = config_get_ptr();

View File

@ -1301,6 +1301,7 @@ enum msg_hash_enums
MENU_LABEL(SETTINGS_SHOW_PLAYLISTS),
MENU_LABEL(SETTINGS_SHOW_USER),
MENU_LABEL(SETTINGS_SHOW_DIRECTORY),
MENU_LABEL(SETTINGS_SHOW_STEAM),
MENU_LABEL(QUICK_MENU_SHOW_RESUME_CONTENT),
MENU_LABEL(QUICK_MENU_SHOW_RESTART_CONTENT),
MENU_LABEL(QUICK_MENU_SHOW_CLOSE_CONTENT),
@ -1592,6 +1593,7 @@ enum msg_hash_enums
MENU_ENUM_LABEL_DEFERRED_CORE_UPDATER_LIST,
MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_LIST,
#ifdef HAVE_MIST
MENU_ENUM_LABEL_DEFERRED_STEAM_SETTINGS_LIST,
MENU_ENUM_LABEL_DEFERRED_CORE_MANAGER_STEAM_LIST,
#endif
MENU_ENUM_LABEL_DEFERRED_THUMBNAILS_UPDATER_LIST,
@ -2310,6 +2312,19 @@ enum msg_hash_enums
MENU_LABEL(CORE_UPDATER_LIST),
MENU_LABEL(CORE_MANAGER_LIST),
#ifdef HAVE_MIST
/* Steam settings */
MENU_LABEL(STEAM_SETTINGS),
MENU_LABEL(STEAM_RICH_PRESENCE_ENABLE),
MENU_LABEL(STEAM_RICH_PRESENCE_FORMAT),
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT,
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CORE,
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_SYSTEM,
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM,
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE,
MENU_ENUM_LABEL_VALUE_STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE,
/* Steam Core Manager */
MENU_LABEL(CORE_MANAGER_STEAM_LIST),
MENU_LABEL(CORE_STEAM_INSTALL),
MENU_LABEL(CORE_STEAM_UNINSTALL),

View File

@ -187,7 +187,7 @@ static void handle_discord_join_cb(retro_task_t *task,
room->gamename, join_hostname, room->corename, room->subsystem_name);
discord_st->connecting = true;
if (discord_st->ready)
discord_update(DISCORD_PRESENCE_NETPLAY_CLIENT);
discord_update(PRESENCE_NETPLAY_CLIENT);
}
finish:
@ -261,7 +261,7 @@ static void handle_discord_join_request(const DiscordUser* request)
#endif
}
void discord_update(enum discord_presence presence)
void discord_update(enum presence presence)
{
discord_state_t *discord_st = &discord_state_st;
#ifdef HAVE_CHEEVOS
@ -273,8 +273,8 @@ void discord_update(enum discord_presence presence)
if (!discord_st->connecting
&&
( presence == DISCORD_PRESENCE_NONE
|| presence == DISCORD_PRESENCE_MENU))
( presence == PRESENCE_NONE
|| presence == PRESENCE_MENU))
{
memset(&discord_st->presence,
0, sizeof(discord_st->presence));
@ -283,7 +283,7 @@ void discord_update(enum discord_presence presence)
switch (presence)
{
case DISCORD_PRESENCE_MENU:
case PRESENCE_MENU:
discord_st->presence.details = msg_hash_to_str(
MENU_ENUM_LABEL_VALUE_DISCORD_IN_MENU);
discord_st->presence.largeImageKey = "base";
@ -291,7 +291,7 @@ void discord_update(enum discord_presence presence)
MENU_ENUM_LABEL_VALUE_NO_CORE);
discord_st->presence.instance = 0;
break;
case DISCORD_PRESENCE_GAME_PAUSED:
case PRESENCE_GAME_PAUSED:
discord_st->presence.smallImageKey = "paused";
discord_st->presence.smallImageText = msg_hash_to_str(
MENU_ENUM_LABEL_VALUE_DISCORD_STATUS_PAUSED);
@ -302,7 +302,7 @@ void discord_update(enum discord_presence presence)
discord_st->start_time);
discord_st->presence.startTimestamp = discord_st->pause_time;
break;
case DISCORD_PRESENCE_GAME:
case PRESENCE_GAME:
{
core_info_t *core_info = NULL;
core_info_get_current_core(&core_info);
@ -372,7 +372,7 @@ void discord_update(enum discord_presence presence)
}
}
break;
case DISCORD_PRESENCE_NETPLAY_HOSTING:
case PRESENCE_NETPLAY_HOSTING:
{
char join_secret[128];
struct netplay_room *room = &networking_state_get_ptr()->host_room;
@ -394,10 +394,10 @@ void discord_update(enum discord_presence presence)
discord_st->presence.partySize = 1;
}
break;
case DISCORD_PRESENCE_NETPLAY_CLIENT:
case PRESENCE_NETPLAY_CLIENT:
discord_st->presence.partyId = strdup(discord_st->peer_party_id);
break;
case DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED:
case PRESENCE_NETPLAY_NETPLAY_STOPPED:
{
if (!netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL) &&
!netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_CONNECTED, NULL))
@ -412,16 +412,16 @@ void discord_update(enum discord_presence presence)
}
break;
#ifdef HAVE_CHEEVOS
case DISCORD_PRESENCE_RETROACHIEVEMENTS:
case PRESENCE_RETROACHIEVEMENTS:
if (discord_st->pause_time)
return;
if (rcheevos_get_richpresence(cheevos_richpresence, sizeof(cheevos_richpresence)) > 0)
discord_st->presence.details = cheevos_richpresence;
presence = DISCORD_PRESENCE_GAME;
presence = PRESENCE_GAME;
break;
#endif
case DISCORD_PRESENCE_SHUTDOWN:
case PRESENCE_SHUTDOWN:
discord_st->presence.partyId = NULL;
discord_st->presence.partyMax = 0;
discord_st->presence.partySize = 0;

View File

@ -25,24 +25,7 @@
#include <discord_rpc.h>
#include "../deps/discord-rpc/include/discord_rpc.h"
enum discord_presence
{
DISCORD_PRESENCE_NONE = 0,
DISCORD_PRESENCE_MENU,
DISCORD_PRESENCE_GAME,
DISCORD_PRESENCE_GAME_PAUSED,
DISCORD_PRESENCE_NETPLAY_HOSTING,
DISCORD_PRESENCE_NETPLAY_CLIENT,
DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED,
DISCORD_PRESENCE_RETROACHIEVEMENTS,
DISCORD_PRESENCE_SHUTDOWN
};
typedef struct discord_userdata
{
enum discord_presence status;
} discord_userdata_t;
#include "presence.h"
/* The Discord API specifies these variables:
- userId --------- char[24] - the userId of the player asking to join
@ -76,7 +59,7 @@ struct discord_state
typedef struct discord_state discord_state_t;
void discord_update(enum discord_presence presence);
void discord_update(enum presence presence);
bool discord_is_ready(void);

View File

@ -45,6 +45,9 @@
#include <string/stdstring.h>
#include <file/file_path.h>
#ifdef HAVE_PRESENCE
#include "../presence.h"
#endif
#ifdef HAVE_DISCORD
#include "../discord.h"
#endif
@ -3965,13 +3968,10 @@ void netplay_hangup(netplay_t *netplay,
else
{
dmsg = msg_hash_to_str(MSG_NETPLAY_CLIENT_HANGUP);
#ifdef HAVE_DISCORD
if (discord_state_get_ptr()->inited)
{
discord_userdata_t userdata;
userdata.status = DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
}
#ifdef HAVE_PRESENCE
presence_userdata_t userdata;
userdata.status = PRESENCE_NETPLAY_NETPLAY_STOPPED;
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
#endif
netplay->is_connected = false;
}
@ -7861,13 +7861,10 @@ static void netplay_announce_cb(retro_task_t *task,
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
}
#ifdef HAVE_DISCORD
if (discord_state_get_ptr()->inited)
{
discord_userdata_t userdata;
userdata.status = DISCORD_PRESENCE_NETPLAY_HOSTING;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
}
#ifdef HAVE_PRESENCE
presence_userdata_t userdata;
userdata.status = PRESENCE_NETPLAY_HOSTING;
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
#endif
}
@ -8156,13 +8153,10 @@ static void netplay_disconnect(netplay_t *netplay)
deinit_netplay();
#ifdef HAVE_DISCORD
if (discord_state_get_ptr()->inited)
{
discord_userdata_t userdata;
userdata.status = DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
}
#ifdef HAVE_PRESENCE
presence_userdata_t userdata;
userdata.status = PRESENCE_NETPLAY_NETPLAY_STOPPED;
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
#endif
}
@ -8442,13 +8436,10 @@ bool netplay_driver_ctl(enum rarch_netplay_ctl_state state, void *data)
case RARCH_NETPLAY_CTL_DISABLE:
net_st->netplay_enabled = false;
#ifdef HAVE_DISCORD
if (discord_state_get_ptr()->inited)
{
discord_userdata_t userdata;
userdata.status = DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
}
#ifdef HAVE_PRESENCE
presence_userdata_t userdata;
userdata.status = PRESENCE_NETPLAY_NETPLAY_STOPPED;
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
#endif
goto done;

22
network/presence.c Normal file
View File

@ -0,0 +1,22 @@
#include "presence.h"
#ifdef HAVE_DISCORD
#include "discord.h"
#endif
#ifdef HAVE_MIST
#include "steam/steam.h"
#endif
void presence_update(enum presence presence)
{
#ifdef HAVE_DISCORD
discord_state_t *discord_st = discord_state_get_ptr();
if (discord_st->ready)
discord_update(presence);
#endif
#ifdef HAVE_MIST
steam_update_presence(presence, false);
#endif
}

24
network/presence.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef __RARCH_PRESENCE_H
#define __RARCH_PRESENCE_H
enum presence
{
PRESENCE_NONE = 0,
PRESENCE_MENU,
PRESENCE_GAME,
PRESENCE_GAME_PAUSED,
PRESENCE_NETPLAY_HOSTING,
PRESENCE_NETPLAY_CLIENT,
PRESENCE_NETPLAY_NETPLAY_STOPPED,
PRESENCE_RETROACHIEVEMENTS,
PRESENCE_SHUTDOWN
};
typedef struct presence_userdata
{
enum presence status;
} presence_userdata_t;
void presence_update(enum presence presence);
#endif /* __RARCH_PRESENCE_H */

View File

@ -102,6 +102,9 @@
#include "play_feature_delivery/play_feature_delivery.h"
#endif
#ifdef HAVE_PRESENCE
#include "network/presence.h"
#endif
#ifdef HAVE_DISCORD
#include "network/discord.h"
#endif
@ -1948,15 +1951,12 @@ bool command_event(enum event_command cmd, void *data)
if (!task_push_start_dummy_core(&content_info))
return false;
}
#ifdef HAVE_DISCORD
if (discord_state_get_ptr()->inited)
{
discord_userdata_t userdata;
userdata.status = DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
userdata.status = DISCORD_PRESENCE_MENU;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
}
#ifdef HAVE_PRESENCE
presence_userdata_t userdata;
userdata.status = PRESENCE_NETPLAY_NETPLAY_STOPPED;
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
userdata.status = PRESENCE_MENU;
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
#endif
#ifdef HAVE_DYNAMIC
path_clear(RARCH_PATH_CORE);
@ -3342,17 +3342,15 @@ bool command_event(enum event_command cmd, void *data)
}
#endif
break;
case CMD_EVENT_DISCORD_UPDATE:
case CMD_EVENT_PRESENCE_UPDATE:
{
#ifdef HAVE_DISCORD
discord_userdata_t *userdata = NULL;
discord_state_t *discord_st = discord_state_get_ptr();
if (!data || !discord_st->ready)
#ifdef HAVE_PRESENCE
presence_userdata_t *userdata = NULL;
if (!data)
return false;
userdata = (discord_userdata_t*)data;
if (discord_st->ready)
discord_update(userdata->status);
userdata = (presence_userdata_t*)data;
presence_update(userdata->status);
#endif
}
break;
@ -5497,17 +5495,16 @@ bool retroarch_main_init(int argc, char *argv[])
if (command_event(CMD_EVENT_DISCORD_INIT, NULL))
discord_st->inited = true;
if (discord_st->inited)
{
discord_userdata_t userdata;
userdata.status = DISCORD_PRESENCE_MENU;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
}
}
#endif
#ifdef HAVE_PRESENCE
presence_userdata_t userdata;
userdata.status = PRESENCE_MENU;
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
#endif
#if defined(HAVE_AUDIOMIXER)
audio_driver_load_system_sounds();
#endif
@ -6013,14 +6010,14 @@ bool retroarch_main_quit(void)
runloop_state_t *runloop_st = runloop_state_get_ptr();
video_driver_state_t*video_st = video_state_get_ptr();
settings_t *settings = config_get_ptr();
#ifdef HAVE_PRESENCE
presence_userdata_t userdata;
userdata.status = PRESENCE_SHUTDOWN;
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
#endif
#ifdef HAVE_DISCORD
discord_state_t *discord_st = discord_state_get_ptr();
if (discord_st->inited)
{
discord_userdata_t userdata;
userdata.status = DISCORD_PRESENCE_SHUTDOWN;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
}
if (discord_st->ready)
{
Discord_ClearPresence();

View File

@ -106,6 +106,9 @@
#include "play_feature_delivery/play_feature_delivery.h"
#endif
#ifdef HAVE_PRESENCE
#include "network/presence.h"
#endif
#ifdef HAVE_DISCORD
#include "network/discord.h"
#endif
@ -5457,8 +5460,8 @@ void runloop_runahead_clear_variables(runloop_state_t *runloop_st)
void runloop_pause_checks(void)
{
#ifdef HAVE_DISCORD
discord_userdata_t userdata;
#ifdef HAVE_PRESENCE
presence_userdata_t userdata;
#endif
runloop_state_t *runloop_st = &runloop_state;
bool is_paused = runloop_st->paused;
@ -5483,9 +5486,9 @@ void runloop_pause_checks(void)
if (!is_idle)
video_driver_cached_frame();
#ifdef HAVE_DISCORD
userdata.status = DISCORD_PRESENCE_GAME_PAUSED;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
#ifdef HAVE_PRESENCE
userdata.status = PRESENCE_GAME_PAUSED;
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
#endif
#ifndef HAVE_LAKKA_SWITCH
@ -6162,11 +6165,11 @@ static bool display_menu_libretro(
if (runloop_idle)
{
#ifdef HAVE_DISCORD
discord_userdata_t userdata;
userdata.status = DISCORD_PRESENCE_GAME_PAUSED;
#ifdef HAVE_PRESENCE
presence_userdata_t userdata;
userdata.status = PRESENCE_GAME_PAUSED;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
#endif
return false;
}
@ -7692,9 +7695,8 @@ int runloop_iterate(void)
#ifdef HAVE_CHEATS
cheat_manager_apply_retro_cheats();
#endif
#ifdef HAVE_DISCORD
if (discord_st->inited && discord_st->ready)
discord_update(DISCORD_PRESENCE_GAME);
#ifdef HAVE_PRESENCE
presence_update(PRESENCE_GAME);
#endif
/* Restores analog D-pad binds temporarily overridden. */

View File

@ -9,6 +9,7 @@
#include "../menu/menu_entries.h"
#include "../retroarch.h"
#include "../runloop.h"
#include "paths.h"
#include "verbosity.h"
#include "steam.h"
@ -16,6 +17,7 @@
static bool mist_initialized = false;
static bool mist_showing_osk = false;
static steam_core_dlc_list_t *mist_dlc_list = NULL;
static enum presence last_presence = PRESENCE_NONE;
void str_to_lower(char *str)
{
@ -43,7 +45,9 @@ void steam_poll(void)
MistCallbackMsg callback;
steam_core_dlc_list_t *core_dlc_list;
bool has_callback = false;
settings_t* settings = config_get_ptr();
static bool has_poll_errored = false;
static bool has_rich_presence_enabled = false;
result = mist_poll();
if (MIST_IS_ERROR(result))
@ -79,6 +83,13 @@ void steam_poll(void)
result = mist_next_callback(&has_callback, &callback);
}
/* Ensure rich presence state is correct */
if(settings->bools.steam_rich_presence_enable != has_rich_presence_enabled)
{
steam_update_presence(last_presence, true);
has_rich_presence_enabled = settings->bools.steam_rich_presence_enable;
}
}
steam_core_dlc_list_t *steam_core_dlc_list_new(size_t count)
@ -350,6 +361,101 @@ bool steam_has_osk_open(void)
return mist_showing_osk;
}
void steam_update_presence(enum presence presence, bool force)
{
settings_t* settings = config_get_ptr();
if (!mist_initialized)
return;
/* Avoid spamming steam with presence updates */
if (presence == last_presence && !force)
return;
last_presence = presence;
/* Ensure rich presence is enabled */
if(!settings->bools.steam_rich_presence_enable)
{
mist_steam_friends_clear_rich_presence();
return;
}
switch (presence)
{
case PRESENCE_MENU:
mist_steam_friends_set_rich_presence("steam_display", "#Status_InMenu");
break;
case PRESENCE_GAME_PAUSED:
mist_steam_friends_set_rich_presence("steam_display", "#Status_Paused");
break;
case PRESENCE_GAME:
{
const char *label = NULL;
const struct playlist_entry *entry = NULL;
core_info_t *core_info = NULL;
playlist_t *current_playlist = playlist_get_cached();
char content[PATH_MAX_LENGTH] = {0};
core_info_get_current_core(&core_info);
if (current_playlist)
{
playlist_get_index_by_path(
current_playlist,
path_get(RARCH_PATH_CONTENT),
&entry);
if (entry && !string_is_empty(entry->label))
label = entry->label;
}
if (!label)
label = path_basename(path_get(RARCH_PATH_BASENAME));
switch(settings->uints.steam_rich_presence_format)
{
case STEAM_RICH_PRESENCE_FORMAT_CONTENT:
strncpy(content, label, sizeof(content) - 1);
break;
case STEAM_RICH_PRESENCE_FORMAT_CORE:
strncpy(content, core_info ? core_info->core_name : "N/A", sizeof(content) - 1);
break;
case STEAM_RICH_PRESENCE_FORMAT_SYSTEM:
strncpy(content, core_info ? core_info->systemname : "N/A", sizeof(content) - 1);
break;
case STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM:
snprintf(content, sizeof(content) - 1, "%s (%s)",
label,
core_info ? core_info->systemname : "N/A");
break;
case STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE:
snprintf(content, sizeof(content) - 1, "%s (%s)",
label,
core_info ? core_info->core_name : "N/A");
break;
case STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE:
snprintf(content, sizeof(content) - 1, "%s (%s - %s)",
label,
core_info ? core_info->systemname : "N/A",
core_info ? core_info->core_name : "N/A");
break;
case STEAM_RICH_PRESENCE_FORMAT_NONE:
default:
break;
}
mist_steam_friends_set_rich_presence("content", content);
mist_steam_friends_set_rich_presence("steam_display",
settings->uints.steam_rich_presence_format != STEAM_RICH_PRESENCE_FORMAT_NONE
? "#Status_RunningContent" : "#Status_Running" );
}
break;
default:
break;
}
}
void steam_deinit(void)
{
MistResult result;

View File

@ -5,6 +5,7 @@
#include <mist.h>
#include "core_info.h"
#include "network/presence.h"
#define MIST_UNPACK_RESULT(result) MIST_RESULT_CODE(result), MIST_ERROR(result)
@ -23,6 +24,18 @@ typedef struct
size_t count;
} steam_core_dlc_list_t;
enum steam_rich_presence_running_format
{
STEAM_RICH_PRESENCE_FORMAT_NONE = 0,
STEAM_RICH_PRESENCE_FORMAT_CONTENT,
STEAM_RICH_PRESENCE_FORMAT_CORE,
STEAM_RICH_PRESENCE_FORMAT_SYSTEM,
STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM,
STEAM_RICH_PRESENCE_FORMAT_CONTENT_CORE,
STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM_CORE,
STEAM_RICH_PRESENCE_FORMAT_LAST
};
void steam_init(void);
void steam_deinit(void);
@ -41,6 +54,8 @@ void steam_uninstall_core_dlc(steam_core_dlc_t *core_dlc);
bool steam_open_osk(void);
bool steam_has_osk_open(void);
void steam_update_presence(enum presence presence, bool force);
/* Located in tasks/task_steam.c */
void task_push_steam_core_dlc_install(AppId app_id, const char *name);

View File

@ -103,8 +103,8 @@
#include "../paths.h"
#include "../verbosity.h"
#ifdef HAVE_DISCORD
#include "../network/discord.h"
#ifdef HAVE_PRESENCE
#include "../network/presence.h"
#endif
#define MAX_ARGS 32
@ -2456,15 +2456,12 @@ static bool task_load_content_internal(
if (firmware_update_status(&content_ctx))
goto end;
#ifdef HAVE_DISCORD
if (discord_state_get_ptr()->inited)
{
discord_userdata_t userdata;
userdata.status = DISCORD_PRESENCE_NETPLAY_NETPLAY_STOPPED;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
userdata.status = DISCORD_PRESENCE_MENU;
command_event(CMD_EVENT_DISCORD_UPDATE, &userdata);
}
#ifdef HAVE_PRESENCE
presence_userdata_t userdata;
userdata.status = PRESENCE_NETPLAY_NETPLAY_STOPPED;
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
userdata.status = PRESENCE_MENU;
command_event(CMD_EVENT_PRESENCE_UPDATE, &userdata);
#endif
/* Loads content into currently selected core. */