assert: Better Emscripten support.
(Better than nothing, that is.) Fixes Bugzilla #3459.
parent
d6f418641d
commit
e889757bb3
|
@ -44,6 +44,11 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__EMSCRIPTEN__)
|
||||||
|
#include <emscripten.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static SDL_assert_state
|
static SDL_assert_state
|
||||||
SDL_PromptAssertion(const SDL_assert_data *data, void *userdata);
|
SDL_PromptAssertion(const SDL_assert_data *data, void *userdata);
|
||||||
|
|
||||||
|
@ -119,6 +124,10 @@ static SDL_NORETURN void SDL_ExitProcess(int exitcode)
|
||||||
{
|
{
|
||||||
#ifdef __WIN32__
|
#ifdef __WIN32__
|
||||||
ExitProcess(exitcode);
|
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
|
#else
|
||||||
_exit(exitcode);
|
_exit(exitcode);
|
||||||
#endif
|
#endif
|
||||||
|
@ -221,9 +230,45 @@ SDL_PromptAssertion(const SDL_assert_data *data, void *userdata)
|
||||||
state = (SDL_assert_state)selected;
|
state = (SDL_assert_state)selected;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef HAVE_STDIO_H
|
|
||||||
else
|
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. */
|
/* this is a little hacky. */
|
||||||
for ( ; ; ) {
|
for ( ; ; ) {
|
||||||
char buf[32];
|
char buf[32];
|
||||||
|
@ -250,8 +295,8 @@ SDL_PromptAssertion(const SDL_assert_data *data, void *userdata)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif /* HAVE_STDIO_H */
|
#endif /* HAVE_STDIO_H */
|
||||||
|
}
|
||||||
|
|
||||||
/* Re-enter fullscreen mode */
|
/* Re-enter fullscreen mode */
|
||||||
if (window) {
|
if (window) {
|
||||||
|
|
Loading…
Reference in New Issue