diff --git a/src/SDL_assert.c b/src/SDL_assert.c index 67710d46b..c64d62624 100644 --- a/src/SDL_assert.c +++ b/src/SDL_assert.c @@ -44,6 +44,11 @@ #endif #endif +#if defined(__EMSCRIPTEN__) +#include +#endif + + static SDL_assert_state SDL_PromptAssertion(const SDL_assert_data *data, void *userdata); @@ -119,6 +124,10 @@ static SDL_NORETURN void SDL_ExitProcess(int exitcode) { #ifdef __WIN32__ ExitProcess(exitcode); +#elif defined(__EMSCRIPTEN__) + emscripten_cancel_main_loop(); /* this should "kill" the app. */ + emscripten_force_exit(exitcode); /* this should "kill" the app. */ + exit(exitcode); #else _exit(exitcode); #endif @@ -221,9 +230,45 @@ SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) state = (SDL_assert_state)selected; } } -#ifdef HAVE_STDIO_H + else { +#if defined(__EMSCRIPTEN__) + /* This is nasty, but we can't block on a custom UI. */ + for ( ; ; ) { + SDL_bool okay = SDL_TRUE; + char *buf = (char *) EM_ASM_INT({ + var str = + Pointer_stringify($0) + '\n\n' + + 'Abort/Retry/Ignore/AlwaysIgnore? [ariA] :'; + var reply = window.prompt(str, "i"); + if (reply === null) { + reply = "i"; + } + return allocate(intArrayFromString(reply), 'i8', ALLOC_NORMAL); + }, message); + + if (SDL_strcmp(buf, "a") == 0) { + state = SDL_ASSERTION_ABORT; + /* (currently) no break functionality on Emscripten + } else if (SDL_strcmp(buf, "b") == 0) { + state = SDL_ASSERTION_BREAK; */ + } else if (SDL_strcmp(buf, "r") == 0) { + state = SDL_ASSERTION_RETRY; + } else if (SDL_strcmp(buf, "i") == 0) { + state = SDL_ASSERTION_IGNORE; + } else if (SDL_strcmp(buf, "A") == 0) { + state = SDL_ASSERTION_ALWAYS_IGNORE; + } else { + okay = SDL_FALSE; + } + free(buf); + + if (okay) { + break; + } + } +#elif defined(HAVE_STDIO_H) /* this is a little hacky. */ for ( ; ; ) { char buf[32]; @@ -250,8 +295,8 @@ SDL_PromptAssertion(const SDL_assert_data *data, void *userdata) break; } } - } #endif /* HAVE_STDIO_H */ + } /* Re-enter fullscreen mode */ if (window) {