diff --git a/command.c b/command.c index 693d32cfa1..cfa0928f95 100644 --- a/command.c +++ b/command.c @@ -1744,8 +1744,8 @@ void command_playlist_update_write( **/ bool command_event(enum event_command cmd, void *data) { - settings_t *settings = config_get_ptr(); - bool boolean = false; + static bool discord_inited = false; + bool boolean = false; switch (cmd) { @@ -1942,25 +1942,26 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_REINIT_FROM_TOGGLE: retroarch_unset_forced_fullscreen(); case CMD_EVENT_REINIT: + video_driver_reinit(); { - video_driver_reinit(); - { - const input_driver_t *input_drv = input_get_ptr(); - void *input_data = input_get_data(); - /* Poll input to avoid possibly stale data to corrupt things. */ - if (input_drv && input_drv->poll) - input_drv->poll(input_data); - } - command_event(CMD_EVENT_GAME_FOCUS_TOGGLE, (void*)(intptr_t)-1); + const input_driver_t *input_drv = input_get_ptr(); + void *input_data = input_get_data(); + /* Poll input to avoid possibly stale data to corrupt things. */ + if (input_drv && input_drv->poll) + input_drv->poll(input_data); + } + command_event(CMD_EVENT_GAME_FOCUS_TOGGLE, (void*)(intptr_t)-1); #ifdef HAVE_MENU + { + settings_t *settings = config_get_ptr(); menu_display_set_framebuffer_dirty_flag(); if (settings->bools.video_fullscreen) video_driver_hide_mouse(); if (menu_driver_is_alive()) command_event(CMD_EVENT_VIDEO_SET_BLOCKING_STATE, NULL); -#endif } +#endif break; case CMD_EVENT_CHEATS_DEINIT: cheat_manager_state_free(); @@ -2826,6 +2827,35 @@ TODO: Add a setting for these tweaks */ libui_main(); #endif break; + case CMD_EVENT_DISCORD_INIT: + { + settings_t *settings = config_get_ptr(); + + if (!settings->bools.discord_enable) + return false; + if (discord_inited) + return true; + + discord_init(); + discord_inited = true; + } + break; + case CMD_EVENT_DISCORD_DEINIT: + if (!discord_inited) + return false; + + discord_shutdown(); + discord_inited = false; + break; + case CMD_EVENT_DISCORD_UPDATE: + if (!data || !discord_inited) + return false; + + { + discord_userdata_t *userdata = (discord_userdata_t*)data; + discord_update(userdata->status); + } + break; case CMD_EVENT_NONE: return false; } diff --git a/command.h b/command.h index c59d938ee0..6b50d6f3eb 100644 --- a/command.h +++ b/command.h @@ -231,6 +231,9 @@ enum event_command CMD_EVENT_DISABLE_OVERRIDES, CMD_EVENT_RESTORE_REMAPS, CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET, + CMD_EVENT_DISCORD_INIT, + CMD_EVENT_DISCORD_DEINIT, + CMD_EVENT_DISCORD_UPDATE, CMD_EVENT_LIBUI_TEST }; diff --git a/discord/discord.h b/discord/discord.h index 5d4bbd2401..a5c397c79f 100644 --- a/discord/discord.h +++ b/discord/discord.h @@ -39,6 +39,11 @@ enum discord_presence DISCORD_PRESENCE_NETPLAY_CLIENT }; +typedef struct discord_userdata +{ + enum discord_presence status; +} discord_userdata_t; + void discord_init(void); void discord_shutdown(void); diff --git a/retroarch.c b/retroarch.c index fee5271d2c..d5c5ebdb26 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1382,13 +1382,16 @@ bool retroarch_main_init(int argc, char *argv[]) rarch_is_inited = true; #ifdef HAVE_DISCORD - { - discord_init(); - discord_is_inited = true; - } + if (command_event(CMD_EVENT_DISCORD_INIT, NULL)) + discord_is_inited = true; if (discord_is_inited) - discord_update(DISCORD_PRESENCE_MENU); + { + discord_userdata_t userdata; + userdata.status = DISCORD_PRESENCE_MENU; + + command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); + } #endif if (rarch_first_start) @@ -2339,8 +2342,7 @@ bool retroarch_main_quit(void) rarch_menu_running_finished(); #ifdef HAVE_DISCORD - if (discord_is_inited) - discord_shutdown(); + command_event(CMD_EVENT_DISCORD_DEINIT, NULL); discord_is_inited = false; #endif @@ -3350,7 +3352,12 @@ int runloop_iterate(unsigned *sleep_ms) #ifdef HAVE_DISCORD if (discord_is_inited) - discord_update(DISCORD_PRESENCE_GAME); + { + discord_userdata_t userdata; + userdata.status = DISCORD_PRESENCE_GAME; + + command_event(CMD_EVENT_DISCORD_UPDATE, &userdata); + } #endif for (i = 0; i < max_users; i++)