diff --git a/src/platform/emscripten/interface.cpp b/src/platform/emscripten/interface.cpp index a486e7744..ba5a88918 100644 --- a/src/platform/emscripten/interface.cpp +++ b/src/platform/emscripten/interface.cpp @@ -23,6 +23,7 @@ #include #include "async_handler.h" +#include "baseui.h" #include "filefinder.h" #include "player.h" #include "scene_save.h" @@ -151,6 +152,12 @@ void Emscripten_Interface::SetSessionToken(std::string t) { i.session_token.assign(t); } +bool Emscripten_Interface::ResetCanvas() { + DisplayUi.reset(); + DisplayUi = BaseUi::CreateUi(Player::screen_width, Player::screen_height, Player::ParseCommandLine()); + return DisplayUi != nullptr; +} + // Binding code EMSCRIPTEN_BINDINGS(player_interface) { emscripten::class_("api") @@ -169,6 +176,7 @@ EMSCRIPTEN_BINDINGS(player_interface) { .class_function("setMusicVolume", &Emscripten_Interface::SetMusicVolume) .class_function("setNametagMode", &Emscripten_Interface::SetNametagMode) .class_function("setSessionToken", &Emscripten_Interface::SetSessionToken, emscripten::allow_raw_pointers()) + .class_function("resetCanvas", &Emscripten_Interface::ResetCanvas) ; emscripten::class_("api_private") diff --git a/src/platform/emscripten/interface.h b/src/platform/emscripten/interface.h index b885b0a1e..f2c909e2a 100644 --- a/src/platform/emscripten/interface.h +++ b/src/platform/emscripten/interface.h @@ -38,6 +38,7 @@ class Emscripten_Interface { static void SetMusicVolume(int volume); static void SetNametagMode(int mode); static void SetSessionToken(std::string t); + static bool ResetCanvas(); }; class Emscripten_Interface_Private { diff --git a/src/platform/emscripten/main.cpp b/src/platform/emscripten/main.cpp index 50f341383..91204f84f 100644 --- a/src/platform/emscripten/main.cpp +++ b/src/platform/emscripten/main.cpp @@ -68,9 +68,14 @@ void main_loop() { Player::MainLoop(); if (!DisplayUi.get()) { // Yield on shutdown to ensure async operations (e.g. IDBFS saving) can finish - counter = -5; + counter = -10; } } else if (counter == -1) { + if (DisplayUi.get()) { + // we previously lost the UI and restored it, so continue doing stuff. + counter = 6; + return; + } emscripten_cancel_main_loop(); } }