Skip to content

Commit

Permalink
Emscripten: Fix async crashes when switching the language
Browse files Browse the repository at this point in the history
Works by delaying the scene switch by one frame so async can suspend the current scene.
  • Loading branch information
Ghabry committed Feb 24, 2025
1 parent 413c9bd commit 1dcd51e
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 5 deletions.
18 changes: 13 additions & 5 deletions src/scene_language.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,6 @@
#include "window_settings.h"
#include <memory>

#ifdef EMSCRIPTEN
# include <emscripten.h>
#endif

Scene_Language::Scene_Language() {
Scene::type = Scene::LanguageMenu;
}
Expand Down Expand Up @@ -125,6 +121,11 @@ void Scene_Language::Start() {


void Scene_Language::vUpdate() {
if (shutdown) {
PopOrTitle();
return;
}

translate_window->Update();
help_window->Update();

Expand All @@ -144,6 +145,10 @@ void Scene_Language::vUpdate() {
}
}

void Scene_Language::OnTranslationChanged() {
Main_Data::game_system->ReloadSystemGraphic();
}

void Scene_Language::OnTitleSpriteReady(FileRequestResult* result) {
BitmapRef bitmapRef = Cache::Title(result->file);

Expand All @@ -169,8 +174,11 @@ void Scene_Language::ChangeLanguage(const std::string& lang_str) {

// First change the language
Player::translation.SelectLanguage(lang_str);
Main_Data::game_system->ReloadSystemGraphic();

PopOrTitle();
// Delay scene shutdown by one frame to allow async requests for language change
// and system graphic reload to finish before the scene switches
shutdown = true;
}

void Scene_Language::PopOrTitle() {
Expand Down
3 changes: 3 additions & 0 deletions src/scene_language.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ class Scene_Language : public Scene {
void Start() override;
void vUpdate() override;

void OnTranslationChanged() override;

private:

/**
Expand Down Expand Up @@ -83,6 +85,7 @@ class Scene_Language : public Scene {
std::unique_ptr<Sprite> title;
FileRequestBinding request_id;
int input_reset_counter = 0;
bool shutdown = false;

Window_Settings::UiMode mode = Window_Settings::eNone;
};
Expand Down
1 change: 1 addition & 0 deletions src/scene_settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ void Scene_Settings::vUpdate() {
case Window_Settings::eSave:
case Window_Settings::eEnd:
case Window_Settings::eAbout:
case Window_Settings::eLanguage: // fix compiler warning, not implemented
break;
case Window_Settings::eMain:
UpdateMain();
Expand Down

0 comments on commit 1dcd51e

Please sign in to comment.